【发布时间】:2019-12-31 07:09:21
【问题描述】:
我对这里明显的不一致感到困惑。它与 setproctitle 模块有关。基本上python3.6可以看到,python3.8不能。
我可以通过运行几个简单的命令行演示来演示:
python3.6 -c "import sys; print(sys.path); import setproctitle; print(setproctitle.__file__)"
和
python3.8 -c "import sys; print(sys.path); import setproctitle; print(setproctitle.__file__)"
这是比较:
$ python3.6 -c "import sys; print(sys.path); import setproctitle; print(setproctitle.__file__)"
['', '/usr/lib/python36.zip', '/usr/lib/python3.6', '/usr/lib/python3.6/lib-dynload', '/home/bernd/.local/lib/python3.6/site-packages', '/usr/local/lib/python3.6/dist-packages', '/usr/lib/python3/dist-packages', '/usr/lib/python3.6/dist-packages']
/usr/lib/python3/dist-packages/setproctitle.cpython-36m-x86_64-linux-gnu.so
$ python3.8 -c "import sys; print(sys.path); import setproctitle; print(setproctitle.__file__)"
['', '/usr/lib/python38.zip', '/usr/lib/python3.8', '/usr/lib/python3.8/lib-dynload', '/home/bernd/.local/lib/python3.8/site-packages', '/usr/local/lib/python3.8/dist-packages', '/usr/lib/python3/dist-packages']
Traceback (most recent call last):
File "<string>", line 1, in <module>
ModuleNotFoundError: No module named 'setproctitle'
对于 Python3.6 和 Python3.8,在这两种情况下,setproctitle 都位于 /usr/lib/python3/dist-packages 中,并且该目录位于 sys.path 中。
我们可以从中得出什么结论?
鉴于名为/usr/lib/python3/dist-packages/setproctitle.cpython-36m-x86_64-linux-gnu.so 的加载文件的名称中有可疑的36m,这表明Python3.8 可能正在寻找/usr/lib/python3/dist-packages/setproctitle.cpython-38m-x86_64-linux-gnu.so,但这会引发辅助问题:我们如何(规范地)获取3.8 包setproctitle 的?
我承认我偷偷尝试过:
sudo ln /usr/lib/python3/dist-packages/setproctitle.cpython-36m-x86_64-linux-gnu.so /usr/lib/python3/dist-packages/setproctitle.cpython-38m-x86_64-linux-gnu.so
又试了一次,但不仅仅是名称。我曾尝试在网上查找有关此信息的信息,但到目前为止我一无所获。如果有一些关于这里发生的事情以及如何为不同的 Python 版本并排放置看似二进制库的简单摘要,我会很高兴提供指针。
我的猜测是:
- .so 文件是一个二进制文件,其中包含指向特定 Python 版本的链接
- 因此需要为 Python3.8 重新构建
- 可能是因为 Python3.8 还很年轻,它还没有重新构建以供分发
- 也许可以即时重建它,也许使用 apt 如果一种新的语法。
【问题讨论】:
标签: python-3.x linux python-import .so