PYTHONPATH против sys.путь
другой разработчик и я не согласен о том, PYTHONPATH или sys.путь должен использоваться, чтобы позволить Python найти пакет Python в каталоге пользователя (например, разработки).
у нас есть проект Python с типичной структурой каталогов:
Project
setup.py
package
__init__.py
lib.py
script.py
In script.py - нам нужно сделать import package.lib. Когда пакет установлен в site-packages, script.py можно найти package.lib.
при работе из каталога пользователя, однако, что-то еще должно быть сделано. Мой решение состоит в том, чтобы установить мой PYTHONPATH для включения "~/Project". Другой разработчик хочет поместить эту строку кода в начало script.py:
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
так что Python может найти локальную копию package.lib.
Я думаю, что это плохая идея, так как эта строка полезна только для разработчиков или людей, работающих с локальной копией, но я не могу дать вескую причину, почему это плохая идея.
должны ли мы использовать PYTOHNPATH, sys.путь, или это либо нормально?
5 ответов:
Если единственная причина изменить путь для разработчиков, работающих из своего рабочего дерева, то вы должны использовать инструмент установки для настройки среды для вас. virtualenv очень популярен, и если вы используете setuptools, вы можете просто запустить
setup.py developна полу-установить рабочее дерево в текущей версии питона.
Я ненавижу PYTHONPATH. Я нахожу это хрупким и раздражающим, чтобы установить на основе каждого пользователя (особенно для пользователей демонов) и отслеживать, как перемещаются папки проекта. Я бы предпочел установить
sys.pathв скриптах вызова для автономных проектов.sys.path.append- это не способ сделать это. Вы можете легко получить дубликаты, и он не разберется.pthфайлы. Лучше (и более читаемый):site.addsitedir.и
script.pyобычно не было бы более подходящим местом для этого это, как это внутри пакета, который вы хотите сделать на пути. Библиотечные модули, конечно, не должны касатьсяsys.pathсами. Вместо этого у вас обычно есть hashbanged-скрипт вне пакета, который вы используете для создания экземпляра и запуска приложения, и именно в этом тривиальном сценарии-оболочке вы бы поместили детали развертывания, такие какsys.path-frobbing.
В общем случае я бы рассмотрел настройку переменной среды (например, PYTHONPATH) чтобы быть плохой практикой. Хотя это может быть хорошо для одной отладки, но используя это как
регулярная практика может быть не очень хорошей идеей.использование переменной окружения приводит к таким ситуациям, как "это работает для меня", когда кто-то
else сообщает о проблемах в базе кода. Также можно было бы провести такую же практику с помощью тестовая среда также, что приводит к таким ситуациям, как тесты в порядке конкретный разработчик, но, вероятно, терпит неудачу, когда кто-то запускает тесты.
наряду со многими другими причинами, упомянутыми выше, вы также можете указать, что жесткое кодирование
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))хрупкий, потому что он предполагает расположение script.py -- это будет работать только если script.py находится в проекте / пакете. Он сломается, если пользователь решит переместить/скопировать / символическую ссылку script.py (почти) где-нибудь еще.
Я думаю, что в этом случае использование PYTHONPATH лучше, главным образом потому, что он не вводит (сомнительный) ненужный код.
в конце концов, если вы думаете об этом, ваш пользователей не нужно
sys.pathвещь, потому что ваш пакет будет установлен в site-packages, потому что вы будете использовать систему упаковки.если пользователь выбирает запуск из "локальной копии", как вы ее называете, то я заметил, что обычная практика заключается в том, чтобы заявить, что пакет должен быть добавлен в PYTHONPATH вручную, если он используется вне пакетов сайта.
Comments