PYTHONPATH против sys.path (ПЕРЕЗАГРУЖЕНО)

Я хочу вернуться к вопросу, как указано в PYTHONPATH vs. sys.path. В основном это связано с разработкой пакета, например:

Project
    setup.py
    package
        __init__.py
        lib.py
        script.py

Предполагая, что script.py делает from package.lib import foo, он работает при вызове:

python -m package.script

из каталога, где сидит setup.py, но не при вызове (на windows, CPython 2.7):

.\package\script.py

ImportError: No module named package

В первом случае при печати sys.path первая запись будет '', а во втором случае первая запись будет абсолютным путем к тому месту, где сидит script.py. И, конечно же, в этом случае он ничего не знает о package, и импорт невозможен. Это также будет иметь место при двойном щелчке в проводнике.

В исходном вопросе о стеке overflow рекомендуется установка пакета setup.py develop. Однако в текущей версии setuptools 3.5 (мне известно + запутано переименование distutils/setuptools) этот вариант даже не задокументирован (у меня setuptools 3.4.x, но не пробовал).

Может ли кто-нибудь указать мне, что рекомендуется ("... единственный очевидный способ сделать это...") в Windows (для CPython 2.7, но также с учетом Python 3) для двойного щелчка по файлу и его работы. Относительный импорт?


person nepix32    schedule 09.05.2014    source источник
comment
Подробнее о том, как работает sys.path, см. в этом ответе stackoverflow.com/a/38403654/850326.   -  person djhaskin987    schedule 15.07.2016
comment
для ошибки с именем модуля: stackoverflow.com/questions/23417941/   -  person JinSnow    schedule 30.11.2016


Ответы (2)


Лучший способ сделать это сейчас — использовать pip install с параметром -e.

pip install -e .

Он использует каталог с файлом setup.py. "." указывает этот каталог. Это работает так же, как метод разработки setuptools.

Я считаю, что разработка создает ссылку на яйцо в папке пакетов вашего взгляда, которая указывает на папку библиотеки. http://pythonhosted.org/setuptools/setuptools.html#develop-deploy-the-project-source-in-development-mode

python setup.py develop

Я считаю, что именно поэтому вы получаете абсолютный путь. Может возникнуть конфликт между ссылкой разработки и установкой. Вещи также могли быть перемещены.

Для двойного щелчка просто есть что-то, что проверяет sys.argv. Если для sys.argv[1] нет значения, добавьте сборку, установку или разработку.

Кроме того, я всегда слышал, что вы хотите импортировать модули, а затем вызывать функции из модулей. из библиотеки импорта пакетов. lib.foo(), чтобы вы знали, откуда взялся этот метод. Я считаю, что импорт делает одно и то же для обоих способов; это может очистить ваш импорт. Пути и упаковка Python могут быть проблемой.

from package import lib
lib.foo()
person justengel    schedule 09.05.2014
comment
Я пробовал develop и это именно то, что я хотел (также работает для двойного щелчка). Недостатком является то, что для этого требуется setup.py (в противном случае мне это не нужно, потому что PyInstaller использует .specfiles). Спасибо за указание местоположения в документации setuptools. - person nepix32; 09.05.2014
comment
По поводу pip install -e .: у меня не работало без setup.py. Что вы имеете в виду под: … использует не setup.py, а каталог …? - person nepix32; 13.05.2014
comment
@ nepix32 Извините, я ошибся. Я хотел сказать, что вы не вызываете файл setup.py или методы установки напрямую. В каталоге должен быть файл setup.py. - person justengel; 13.05.2014
comment
Что-то подобное я уже придумал :) ‹режим придирки› Остался последний вопрос: при выполнении pip uninstall %mypackage% есть ли что-то, что удалит каталог %mypackage%.egg-info также ?‹/режим придирки› - person nepix32; 13.05.2014
comment
@ nepix32 Когда я попробовал методы удаления, они не сработали. В Setuptools также должен быть python setup.py develop --uninstall, но у меня это тоже не сработало. Вы можете зайти в папку python lib/site-packages и удалить файл egg-link и удалить каталог из easy-install.pth. - person justengel; 13.05.2014
comment
Хорошо, это интересно, потому что и pip uninstall %mypackage%, и setup.py develop --uninstall внесли необходимые изменения в site-packages, но оставили egg-info в расположении пакета разработчика (так что в основном удаление работает, но оставляет некоторые файлы в расположении пакета разработчика). - person nepix32; 13.05.2014