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

Я пытаюсь собрать дистрибутив 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 = 'me@here.com',
) 

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

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

Ответы [ 5 ]

5 голосов
/ 02 мая 2009

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

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

2 голосов
/ 15 июня 2010

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

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

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

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

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

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

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

Чтобы увидеть рабочий пример оформления заказа мой проект .

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

2 голосов
/ 03 мая 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)))

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

0 голосов
/ 24 февраля 2015

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

0 голосов
/ 01 мая 2009

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

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

...