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

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

/code
    /mypackage
        __init__.py
        file1.py
        file2.py
        /subpackage
            __init__.py
    /build
        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 = '[email protected]',
) 

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

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


person Chris B.    schedule 01.05.2009    source источник


Ответы (5)


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

Вы можете упаковать все на один каталог выше (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 = '[email protected]',
    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 в дистрибутив в том же месте, где вы его нашли.

person Jon-Eric    schedule 02.05.2009
comment
Мне все равно, как выглядит структура в файле дистрибутива, пока он работает правильно, когда пользователи пытаются установить его с помощью easy_install. Но документация Python совершенно ужасна, когда дело доходит до этих деталей — я понятия не имею, как вообще должна выглядеть структура. И я все еще обдумываю идею о том, что вы запускаете скрипт в дистрибутиве до его установки, чтобы установить дистрибутив. - person Chris B.; 05.05.2009

Может быть, сначала перейти в родительский каталог?

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)))

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

person Ken Arnold    schedule 03.05.2009

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

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

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

  • ЛИЦЕНЗИЯ.txt
  • README.txt
  • УСТАНОВИТЬ.txt
  • TODO.txt
  • ИЗМЕНЕНИЙ.txt

Когда вы запускаете «setup.py sdist», он должен автоматически генерировать МАНИФЕСТ, включая: — любые файлы, указанные в py_modules и/или пакетах — setup.py — README.txt

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

Для более или менее приличного объяснения этого прочитайте это.

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

Примечание. Я не помещаю МАНИФЕСТ в систему контроля версий, поэтому вы его там не найдете.

person Evan Plaice    schedule 15.06.2010

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

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

person easel    schedule 01.05.2009

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

person kutschkem    schedule 24.02.2015