Как я могу заставить setup.py использовать относительный путь к моим файлам?

Я пытаюсь построить дистрибутив Python с distutils . К сожалению, моя структура каталогов выглядит так:

 /код
     / MyPackage
         __init__.py
         file1.py
         file2.py
         / подпакет
             __init__.py
     / строительство
         setup.py

Вот мой файл setup.py :

 from distutils.core import setup setup( name = 'MyPackage', description = 'This is my package', packages = ['mypackage', 'mypackage.subpackage'], package_dir = { 'mypackage' : '../mypackage' }, version = '1', url = 'http://www.mypackage.org/', author = 'Me', author_email = 'me@here.com', ) 

Когда я запускаю python setup.py sdist он правильно генерирует файл манифеста, но не включает мои исходные файлы в дистрибутиве. По-видимому, он создает каталог, содержащий исходные файлы (то есть mypackage1 ), а затем копирует каждый из исходных файлов в mypackage1/../mypackage который помещает их вне дистрибутива.

Как я могу исправить это, не заставляя структуру каталогов соответствовать ожиданиям distutils ?

5 Solutions collect form web for “Как я могу заставить setup.py использовать относительный путь к моим файлам?”

Какую структуру каталогов вы хотите использовать внутри файла архива распределения? Как и ваша существующая структура?

Вы можете упаковать все один каталог выше ( code в вашем примере) с помощью этого измененного файла setup.py:

 from distutils.core import setup setup( name = 'MyPackage', description = 'This is my package', packages = ['mypackage', 'mypackage.subpackage'], version = '1', url = 'http://www.mypackage.org/', author = 'Me', author_email = 'me@here.com', script_name = './build/setup.py', data_files = ['./build/setup.py'] ) 

Вы запустили бы это (в каталоге code ):

 python build/setup.py sdist 

Или, если вы хотите сохранить dist внутри сборки:

 python build/setup.py sdist --dist-dir build/dist 

Мне нравится структура каталогов, в которой вы пытаетесь. Я никогда не думал, что setup.py достаточно для того, чтобы гарантировать, что он находится в папке корневого кода. Но нравится это или нет, я думаю, что именно там будут ожидать пользователи вашего дистрибутива. Поэтому неудивительно, что вам нужно обмануть distutils, чтобы сделать что-то еще. Параметр data_files – это взломать, чтобы получить setup.py в дистрибутив в том же месте, где вы его разместили.

Запустите setup.py из корневой папки проекта.

В вашем случае поместите setup.py в код /

код / ​​должен также включать:

  • lICENSE.TXT
  • README.txt
  • INSTALL.txt
  • todo.txt
  • CHANGELOG.txt

Когда вы запускаете «setup.py sdist», он должен автогенерировать MANIFEST, включая: – любые файлы, указанные в py_modules и / или пакетах – setup.py – README.txt

Чтобы добавить больше файлов, просто отредактируйте файл MANIFEST вручную, чтобы включить любые другие файлы, необходимые вашему проекту.

За несколько приличное объяснение этого читайте это .

Чтобы увидеть рабочий пример, проверьте мой проект .

Примечание. Я не помещаю MANIFEST под контроль версий, поэтому вы не найдете его там.

Обходной метод sorta lame, но я бы, вероятно, просто использовал Makefile, который rsynced ./mypackage в ./build/mypackage, а затем использовал обычный синтаксис distutils изнутри ./build. Факт заключается в том, что distutils ожидает распаковать setup.py в корень sdist и иметь под ним код, поэтому у вас будет чертовски время, убеждая его сделать иначе.

Вы всегда можете уничтожить копию, когда будете чистить, поэтому вам не нужно испортить vcs.

Также обходное решение, но соединение / ссылка каталога пакета внутри проекта сборки должна работать.

Возможно, это изменится на родительский каталог?

 import os os.chdir(os.pardir) from distutils.core import setup 

и т.п.

Или если вы можете запускать его из любого места (это слишком много, но …):

 import os.path my_path = os.path.abspath(__file__) os.chdir(os.normpath(os.path.join(my_path, os.pardir))) 

и т. д. Не уверен, что это работает, но должно быть легко попробовать.

Python - лучший язык программирования в мире.