Яйца в пути до переменной окружения PYTHONPATH

Если у меня есть пакеты, установленные из easy_install , яйца добавляются к sys.path перед элементами в переменной PYTHONPATH .

Например, если у меня есть пакет яиц с именем foo, а также пакет с именем foo в текущем каталоге, а затем выполните следующее:

 PYTHONPATH="." python >>> import foo 

Это будет использовать версию яйца foo вместо локального каталога. Проверка sys.path показывает, что яйца помещаются перед предметами из PYTHONPATH . Это кажется сломанным. Есть ли способ отменить это поведение?

3 Solutions collect form web for “Яйца в пути до переменной окружения PYTHONPATH”

К сожалению, это делается с жестко закодированным шаблоном, находящимся глубоко внутри setuptools/command/easy_install.py . Вы можете создать исправленный setuptools с отредактированным шаблоном, но я не нашел чистого способа расширения easy_install извне.

Каждый раз, когда выполняется easy_install, он регенерирует файл easy_install.pth . Вот быстрый скрипт, который вы можете запустить после easy_install, чтобы удалить верхний и нижний колонтитулы с easy_install.pth . Вы можете создать сценарий оболочки оболочки, чтобы запустить это сразу после easy_install :

 #!/usr/bin/env python import sys path = sys.argv[1] lines = open(path, 'rb').readlines() if lines and 'import sys' in lines[0]: open(path, 'wb').write(''.join(lines[1:-1]) + '\n') 

Пример:

 % easy_install gdata % PYTHONPATH=xyz python -c 'import sys; print sys.path[:2]' ['', '/Users/pat/virt/lib/python2.6/site-packages/gdata-2.0.14-py2.6.egg'] % ./fix_path ~/virt/lib/python2.6/site-packages/easy_install.pth % PYTHONPATH=xyz python -c 'import sys; print sys.path[:2]' ['', '/Users/pat/xyz'] 

Для получения более подробного описания, вот формат easy-install.pth :

 import sys; sys.__plen = len(sys.path) ./gdata-2.0.14-py2.6.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) 

Две линии import sys являются виновниками, вызывающими появление яиц в начале пути. Мой скрипт просто удаляет эти строки sys.path -munging.

Я сделал что-то вроде следующего, чтобы перейти к системному пути при запуске исполняемого файла на Python верхнего уровня:

 import sys sys.path = ["<your python path>"] + sys.path 

Часто "<your python path>" для меня включает использование атрибута __file__ для относительного поиска пути, который включает в себя модуль верхнего уровня для моего проекта. Это не рекомендуется использовать при производстве яиц, хотя я, похоже, не думаю о последствиях. Может быть другая альтернатива __file__ .

Рассмотрите возможность использования опции командной строки -S для подавления *.pth обработки:

 python -c 'import sys; print("\n".join(sys.path))' python -S -c 'import sys; print("\n".join(sys.path))' 

https://docs.python.org/3/library/site.html#site.main

Вы также можете использовать -S с site.main() для задержки *.pth обработки до времени исполнения, скажем, для захвата исходного sys.path для добавления:

 export PYTHONPATH=$( PYTHONPATH='' \ python -c 'import sys; \ sys.path.extend(sys.argv[1:]); old=list(sys.path); \ import site; site.main(); \ [ old.append(p) for p in sys.path if p not in old ]; \ sys.path=old; \ print ":".join(sys.path)' \ $EXTRA_PATH $ANOTHER_PATH) python -S ... # using explicit PYTHONPATH 
  • Начать с явного пустого PYTHONPATH
  • Приложить к sys.path явно с расширением
  • Импортируйте сайт и вызовите site.main()
  • Добавить новые пути к старому пути, а затем установить его в sys.path
  • Печать с помощью «:» для PYTHONPATH
  • python -S желательно для последующих запусков только с использованием $PYTHONPATH
  • python -S может быть или не быть желательным при установке PYTHONPATH (в зависимости от того, нужен ли вам sys.path, расширенный до продолжения)
  • Как настроить __main__.py, __init__.py и __setup__.py для базовой установки пакета?
  • Нет модуля с именем pkg_resources
  • Параметр entry_script Setuptools не найден с установкой, но он найден с помощью
  • Установка ScientificPython в качестве зависимости
  • Как установить старую версию Django на virtualenv?
  • Ошибка Python ex_setup.py urlopen getaddrinfo не удалось
  • Как импортировать пакет PIP через Jython?
  • install_requires на основе версии python
  • Python setuptools: как я могу перечислить приватный репозиторий в install_requires?
  • Как написать setup.py для twistd / twisted plugin, который работает с setuptools, распространяет и т. Д.?
  • "Объект AttributeError: 'module' не имеет атрибута" с установленным пакетом
  •  
    Interesting Posts for Van-Lav

    Python-скрипт знает, сколько памяти используется

    Несколько пользовательских ввода в командной строке приложения Python

    Часы и эфемерный узел не работают, когда состояние zookeeper изменяется автоматически?

    Инструменты Django и OneToOneField

    Что было бы хорошим примером «отправки сообщений в объекты» в Python?

    Python: в чем разница между (1,2,3) и , и когда я должен использовать их?

    Как установить разные уровни для разных обработчиков журналов python

    Python & Tkinter -> О вызове долговременной функции, которая замораживает программу

    Самая длинная расширяющаяся уникальная подпоследовательность

    Объединение двух списков в строку

    Пагинация с использованием

    Анимация с помощью процедуры pcolormesh в matplotlib, как мне инициализировать данные?

    Среднее значение группировки в другом векторе (numpy / Python)

    IPython не запускается

    Python: максимальная глубина рекурсии превышена при печати пользовательского исключения

    Python - лучший язык программирования в мире.