私は何年もの間これを理解しようとしてきました。
特定の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
を比較してみましたpython sys.path
リストも同じです。
マシンは-UbuntuServer 14.04x64です。
更新:
私はそれを修正したと思います...しかし、どうすればいいのかわかりません。この質問にリストしたすべてのことを実行し、マシンを再起動しました。
別の更新:
私はそれを引き起こした原因を学びました。 export LD_LIBRARY_PATH="/usr/lib/plexmediaserver"
に.bashrc
がありました。誰かが説明してもらえますか、なぜこれが起こるのでしょうか?
echo $LD_LIBRARY_PATH
を実行しても、結果はありません。しかし、export LD_LIBRARY_PATH="/usr/lib/plexmediaserver"
を実行すると、いくつかのpythonインポートが壊れます。
解決しました。
_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
。
私はインターネット上で多くの人々が全く解決策なしで同様の質問を投稿しているのを見てきました。うまくいけば、これは誰かを助けるでしょう。