2009-05-01 1 views
9

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

 
/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?

ответ

0

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

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

4

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

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

+5

Меня не волнует, как выглядит структура в файле распределения, если она делает то же самое, когда пользователи пытаются установить ее с помощью easy_install. Но документация Python абсолютно ужасна, когда речь заходит об этих деталях - я понятия не имею, как должна выглядеть структура. И я все еще склоняюсь к мысли, что вы запускаете скрипт в дистрибутиве до его установки, чтобы установить дистрибутив. –

0

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

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

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

1

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

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

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

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

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

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

За несколько достойное объяснение этого read this.

Чтобы увидеть рабочий пример checkout my project.

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

0

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

 Смежные вопросы

  • Нет связанных вопросов^_^