Почему текущий рабочий каталог влияет на путь установки setup.py? Как это предотвратить?
Я создал собственный пакет Python, следуя этому руководству, поэтому у меня есть следующая структура:
mypackage/ <-- VCS root
mypackage/
submodule1/
submodule2/
setup.py
И setup.py содержит точно такую же информацию, как в руководстве:
from setuptools import setup, find_packages
setup(name='mypackage',
version='0.1',
description='desc',
url='vcs_url',
author='Hodossy, Szabolcs',
author_email='myemail@example.com',
license='MIT',
packages=find_packages(),
install_requires=[
# deps
],
zip_safe=False)
Я заметил, если я захожу в папку, где находится setup.py, а затем вызвать python setup.py install
в виртуальной среде в пакетах сайта устанавливается следующая структура:
.../site-packages/mypackage-0.1-py3.6.egg/mypackage/
submodule1/
submodule2/
но если я позвоню из одной папки вверх, как python mypackage/setup.py install
тогда структура выглядит следующим образом:
.../site-packages/mypackage-0.1-py3.6.egg/mypackage/
mypackage/
submodule1/
submodule2/
Это позже разрушает весь импорт из моего модуля, так как путь для подмодулей отличается.
Не могли бы вы объяснить, что здесь происходит и как предотвратить такое поведение?
Это происходит с Python 3.6 как в Windows, так и в Linux.
1 ответ
Ваш setup.py не содержит никаких путей, но, кажется, находит файлы только через find_packages
, Так что, конечно, это зависит от того, где вы его запускаете. Файл setup.py не привязан к его местоположению. Конечно, вы могли бы сделать такие вещи, как chdir
к basename
пути к установочному файлу в sys.argv[0]
, но это довольно некрасиво.
Вопрос в том, ПОЧЕМУ вы хотите построить его таким образом? Похоже, что вы хотели бы структуру как
mypackage-source
mypackage
submodule1
submodule2
setup.py
А затем выполните setup.py из рабочего каталога. Если вы хотите иметь возможность запускать его из любого места, лучшим решением будет поместить рядом с ним оболочку, например
#!/bin/sh
cd ``basename $0``
python setup.py $@
которая отделяет задачу перехода в правильный каталог (здесь я предполагаю, что каталог с setup.py в рабочем каталоге) от запуска setup.py