Почему текущий рабочий каталог влияет на путь установки 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

Другие вопросы по тегам