Setup.py: переименование пакета src для имени проекта

Скажем, у вас есть проект под названием proj, и в этом проекте у вас есть следующая структура:

proj/
 dists/
 doc/
 src/
 __init__.py
 xyz.py
 abc.py
 test/
 setup.py

Как вы можете видеть, весь контент вашего проекта находится в подпапке src. Как сделать дистрибутивный пакет distutils из папки src?

Моя наивная идея, следуя учебнику, должна была написать setup.py следующим образом:

#omitting basics
setup(
 name='proj',
 packages=['src'],
 package_dir={'proj':'src'}
)

Но после установки результирующего пакета в мою систему мне все равно придется импортировать src.xyz, а не proj.xyz, что было бы целью и ожидаемым результатом.

3 ответа

Вы можете исправить это, поместив файлы пакета Python в каталог proj/:

proj/
 src/
 proj/
 __init__.py
 xyz.py
 abc.py
 setup.py

И изменив setup.py на:

# ...
setup(
 name='proj',
 packages=['proj'],
 package_dir={'':'src'}
)

Это не требуется distutils, но другие инструменты могут ожидать, что имя родительского каталога файла __init__.py будет таким же, как имя пакета Python, т.е. proj в этом случае.


Это связано с ошибкой в ​​setuptools, описанной здесь: https://github.com/pypa/setuptools/issues/250

В принципе, он работает, но не в режиме dev. Теперь у вас есть 3 решения:

  • символически связывает пакет src как proj (и игнорировать его при поступлении), он будет работать из коробки, но грязный
  • измените с src на proj
  • создайте подкаталог proj в src и используйте следующие параметры:
packages=['proj'],
package_dir={'proj': 'src/proj'},


Вы можете попробовать добавить папку src в PYTHONPATH до вызова функции setup:

import sys, os
src_path = os.path.join(os.path.realpath(os.path.dirname(__file__)), 'src')
sys.path.append(src_path)

А также, чтобы быть в безопасности, вы затем меняете рабочий каталог:

os.chdir(src_path)

После этого все должно быть в порядке.

Некоторые другие инструменты для упаковки поддержки вашего приложения изнутри. Я думал, что это setuptools, получается ***********. Но в основном, что нужно делать, достаточно, чтобы ваши пакеты были импортированы напрямую.

Оказывается, distutils имеет директиву package_dir. Это то, что вы должны использовать, но это может сработать, только добавив ваш пакет к PYTHONPATH.

licensed under cc by-sa 3.0 with attribution.