Я уже много лет пытаюсь это понять.
Когда я запускаю некоторые программы 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
рабочими пользователями, но ничего не помогает. sys.path
Список Python также идентичен.
Машина - 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
.
Я видел много людей в интернете, которые задавали подобные вопросы без каких-либо решений. Надеюсь, это кому-то поможет.