easy_install закрывает мой файл easy-install.pth и удаляет команды python в начале и конце файла - PullRequest
0 голосов
/ 02 декабря 2018

У меня странная проблема с моим sys.path;Так как я собираюсь описать проблему ясно, этот пост будет немного длинным.

my /usr/lib/python2.7/site-packages/easy-install.pth выглядит так:

import sys; sys.__plen = len(sys.path)
./setuptools-27.2.0-py2.7.egg
./jmespath-0.9.3-py2.7.egg
./chardet-3.0.4-py2.7.egg
./certifi-2018.01.18-py2.7.egg
./urllib3-1.22-py2.7.egg
./requests-2.18.4-py2.7.egg
./docutils-0.14-py2.7.egg
./python_dateutil-2.7.5-py2.7.egg
./enum34-1.1.6-py2.7.egg
./six-1.10.0-py2.7.egg
./ipaddress-1.0.18-py2.7.egg
./asn1crypto-0.22.0-py2.7.egg
./idna-2.6-py2.7.egg
./pyOpenSSL-17.2.0-py2.7.egg
/usr/lib64/python2.7/site-packages/cryptography-2.0.3-py2.7-linux-x86_64.egg
/usr/lib64/python2.7/site-packages/cffi-1.10.0-py2.7-linux-x86_64.egg
import sys; new=sys.path[sys.__plen:]; del sys.path[sys.__plen:]; p=getattr(sys,'__egginsert',0); sys.path[p:p]=new; sys.__egginsert = p+len(new)

С этим у меня все работает нормально;в частности, правильная версия pyOpenSSL включается в мои sys.path:

[root@sandbox ~]# python -c "import OpenSSL; print OpenSSL.__version__"
17.2.0

, когда я удаляю первую и последнюю строки, команды python изменяют мою версию pyOpenSSL;это означает, что когда мой easy-install.pth выглядит следующим образом:

./setuptools-27.2.0-py2.7.egg
./jmespath-0.9.3-py2.7.egg
./chardet-3.0.4-py2.7.egg
./certifi-2018.01.18-py2.7.egg
./urllib3-1.22-py2.7.egg
./requests-2.18.4-py2.7.egg
./docutils-0.14-py2.7.egg
./python_dateutil-2.7.5-py2.7.egg
./enum34-1.1.6-py2.7.egg
./six-1.10.0-py2.7.egg
./ipaddress-1.0.18-py2.7.egg
./asn1crypto-0.22.0-py2.7.egg
./idna-2.6-py2.7.egg
./pyOpenSSL-17.2.0-py2.7.egg
/usr/lib64/python2.7/site-packages/cryptography-2.0.3-py2.7-linux-x86_64.egg
/usr/lib64/python2.7/site-packages/cffi-1.10.0-py2.7-linux-x86_64.egg

, тогда версия pyOpenSSL является более старой версией:

[root@sandbox ~]# python -c "import OpenSSL; print OpenSSL.__version__"
0.13.1

Я думаю, это потому, что более старая версия pyOpenSSLздесь присутствует /usr/lib64/python2.7/site-packages/pyOpenSSL-0.13.1-py2.7.egg-info

поэтому мой первый вопрос: Что эти команды делают в easy-install.pth и как обрабатывается easy-install.pth для изменения моего sys.path?

Далее, когда я пытаюсь установить новые пакеты Python, используя easy_install (из их исходного кода), он забивает мой easy-install.pth - в том смысле, что все пакеты все еще будут там, но безпервая и последняя строки (эти команды python).

Чтобы быть более конкретным: я пытаюсь установить idna-2.5, и он успешно устанавливается, но портится easy-install.pth

[root@sandbox idna-2.5]# easy_install .
Processing .
Writing /opt/proj/sbs-installs/COSpkgs/idna-2.5/setup.cfg
Running setup.py -q bdist_egg --dist-dir /opt/proj/sbs-installs/COSpkgs/idna-2.5/egg-dist-tmp-sLNbiE
warning: no previously-included files matching '*.pyc' found under directory 'tools'
warning: no previously-included files matching '*.pyc' found under directory 'tests'
zip_safe flag not set; analyzing archive contents...
Removing /usr/lib/python2.7/site-packages/idna-2.5-py2.7.egg
Moving idna-2.5-py2.7.egg to /usr/lib/python2.7/site-packages
Removing idna 2.6 from easy-install.pth file
Adding idna 2.5 to easy-install.pth file

Installed /usr/lib/python2.7/site-packages/idna-2.5-py2.7.egg
Processing dependencies for idna==2.5
Finished processing dependencies for idna==2.5

Замечаниечто он удалил idnz 2.6.После этого мой easy-install.pth выглядит следующим образом:

./setuptools-27.2.0-py2.7.egg
./jmespath-0.9.3-py2.7.egg
./chardet-3.0.4-py2.7.egg
./certifi-2018.01.18-py2.7.egg
./urllib3-1.22-py2.7.egg
./requests-2.18.4-py2.7.egg
./docutils-0.14-py2.7.egg
./python_dateutil-2.7.5-py2.7.egg
./enum34-1.1.6-py2.7.egg
./six-1.10.0-py2.7.egg
./ipaddress-1.0.18-py2.7.egg
./asn1crypto-0.22.0-py2.7.egg
./pyOpenSSL-17.2.0-py2.7.egg
/usr/lib64/python2.7/site-packages/cryptography-2.0.3-py2.7-linux-x86_64.egg
/usr/lib64/python2.7/site-packages/cffi-1.10.0-py2.7-linux-x86_64.egg
./idna-2.5-py2.7.egg

и теперь, когда я проверяю версию pyOpenSSL, она старая (как упоминалось выше):

[root@sandbox ~]# python -c "import OpenSSL; print OpenSSL.__version__"
0.13.1

Спасибо за вашу помощьзаранее.

1 Ответ

0 голосов
/ 03 декабря 2018

Потребовалось немного покопаться, чтобы найти ответ.Я публикую ответ здесь для полноты и возможности поиска:).

Команда python в начале easy-install.pth называется prelude , а команда в последней строке называется postlude setuptools code).

Как и ожидалось easy_install перезаписывает PathDistributions, т.е. easy-install.pth, если ваша установка приводит к удалениюстарого пакета и установка нового пакета.

Теперь, если вы хотите включить prelude и postlude, код ожидает, что для свойства среды SETUPTOOLS_SYS_PATH_TECHNIQUE будет установлено значение rewrite (значение по умолчанию равноraw).Проще говоря, следующие команды устранили проблему:

[root@sandbox idna-2.5]# export SETUPTOOLS_SYS_PATH_TECHNIQUE=rewrite
[root@sandbox idna-2.5]# easy_install .
Processing .
Writing /opt/proj/sbs-installs/COSpkgs/idna-2.5/setup.cfg
Running setup.py -q bdist_egg --dist-dir /opt/proj/sbs-installs/COSpkgs/idna-2.5/egg-dist-tmp-gE1V2U
warning: no previously-included files matching '*.pyc' found under directory 'tools'
warning: no previously-included files matching '*.pyc' found under directory 'tests'
zip_safe flag not set; analyzing archive contents...
Removing /usr/lib/python2.7/site-packages/idna-2.5-py2.7.egg
Moving idna-2.5-py2.7.egg to /usr/lib/python2.7/site-packages
Removing idna 2.6 from easy-install.pth file
Adding idna 2.5 to easy-install.pth file

Installed /usr/lib/python2.7/site-packages/idna-2.5-py2.7.egg
Processing dependencies for idna==2.5
Finished processing dependencies for idna==2.5
[root@sandbox idna-2.5]# 
...