多年来我一直试图弄清楚这一点。
当我运行某些 python 程序时,它们会崩溃,说某些模块无法导入,而它实际上已安装并且应该是可导入的。例如:
pip3
会崩溃ImportError: cannot import name 'HTTPSHandler
python2 speedtest-cli
和ImportError: No module named expat; use SimpleXMLTreeBuilder instead
python3 speedtest-cli
和ImportError: cannot import name 'HTTPSConnection'
virtualenv -p python3 myenv
和OSError: Command /home/myuser/myenv/bin/python3 -c "import sys, pip; sys...d\"] + sys.argv[1:]))" setuptools pip failed with error code 1
奇怪的是,如果我以新的普通用户身份运行这些程序,sudo
或者甚至以新的普通用户身份运行这些程序,它们就会运行得很好。仅针对该特定用户发生这种情况。
我尝试清除.cache
,.pip
并.python-eggs
在主目录中运行chmod a+rx -R /usr/
将所有 python 可执行文件与which
工作用户进行比较,但没有任何帮助。 pythonsys.path
列表也是相同的。
机器是 - Ubuntu Server 14.04 x64。
更新:
我想我修好了...但不知道怎么办。我已经完成了这个问题中列出的所有操作并重新启动了机器。
另一个更新:
我知道是什么原因造成的。我有export LD_LIBRARY_PATH="/usr/lib/plexmediaserver"
在我的.bashrc
。有人可以解释一下,为什么会发生这种情况吗?
如果我这样做的话,不会有任何结果echo $LD_LIBRARY_PATH
。但如果我运行export LD_LIBRARY_PATH="/usr/lib/plexmediaserver"
它会破坏一些 python 导入。
答案1
解决了。
我有export LD_LIBRARY_PATH="/usr/lib/plexmediaserver"
在我的.bashrc
。
/usr/lib/plexmediaserver
有很多动态库,包括libssl.so.1.0.0
和libexpat.so.1
.因此,它们被加载而不是来自/usr/lib
并导致问题。这个问题实际上与 python 无关,它同样会给依赖这些库的任何其他程序带来问题。
@slm 建议了一种使用 来调试此类情况的好方法strace
。我的情况是strace speedtest 2>&1 | grep expat | less
,我发现了加载错误库的证据 - open("/usr/lib/plexmediaserver/libexpat.so.1", O_RDONLY|O_CLOEXEC) = 7
。
我在互联网上看到很多人发布类似的问题,但根本没有解决方案。所以希望这会对某人有所帮助。