Подтвердить что ты не робот

MANIFEST.in игнорируется на "python setup.py install" - файлы данных не установлены?

Здесь мой урезанный setup.py script с удалением ненулевого кода:

#!/usr/bin/env python

from distutils.core import setup
from whyteboard.misc import meta


setup(
    name = 'Whyteboard',
    version = meta.version,

    packages = ['whyteboard', 'whyteboard.gui', 'whyteboard.lib', 'whyteboard.lib.pubsub',
                'whyteboard.lib.pubsub.core', 'whyteboard.lib.pubsub.utils', 'whyteboard.misc'],

    py_modules = ['whyteboard'],
    scripts = ['whyteboard.py'],
)

MANIFEST.in:

include *.txt
include whyteboard-help/*.*
recursive-include locale *.mo
recursive-include images *.png

Когда я запускаю "python setup.py install sdist", я получаю приятный .tar.gz с корневой папкой "whyteboard-0.41", с внутренними папками/images/и whyboardboard-help/folders. Это также имеет мою whyteboard.py script, которая запускает мою программу из исходного пакета whyboard.

Итак:

whyteboard/
 ├── locale/
 ├── images
 ├── whyteboard-help/
 ├── whyteboard/
 │  ├── __init__.py
 │  └── other packages etc
 ├── whyteboard.py
 ├── README
 ├── setup.py
 └── CHANGELOG

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

Однако, когда я запускаю "python setup.py install", ни один из моих файлов данных не написан - только исходный пакет "whyteboard", а whyteboard.py помещается в /usr/local/lib/python 2.6/dist -packages/.

В идеале, мне бы хотелось, чтобы одна и та же структура каталогов была создана в файле .tar.gz, который будет создан в dist-пакетах, так как моя программа рассчитывает на поиск ее ресурсов.

Как я могу получить "установить" для создания этой структуры каталогов? Насколько мне известно, кажется, что я игнорирую мой файл манифеста.

4b9b3361

Ответ 1

Некоторые примечания помимо ответа Ned (который касается основной проблемы):

Distutils не устанавливает пакеты и модули Python внутри подкаталога для каждого проекта в пределах site-packages (или dist-packages на Debian/Ubuntu): они установлены непосредственно в site-packages, как вы видели. Таким образом, содержащая директория whyteboard-xx в вашем sdist не будет существовать в окончательной установленной форме.

Одним из следствий этого является то, что вы должны быть осторожны, чтобы называть ваш data_files таким образом, чтобы уточнить, к какому проекту они принадлежат, поскольку эти файлы/каталоги установлены непосредственно в глобальный каталог site-packages, а не внутри любого содержащего whyteboard.

Или вы могли вместо этого сделать свои данные package_data пакета whyteboard (что означает, что он должен жить внутри этого пакета, то есть рядом с __init__.py), а затем это не проблема.

Наконец, нет смысла иметь как модуль whyteboard.py в py_modules, так и пакет whyteboard/__init__.py в packages. Эти два являются взаимоисключающими, и если у вас есть оба, модуль whyteboard.py будет игнорироваться импорт в пользу пакета с тем же именем.

Если whyteboard.py является всего лишь script и не предназначен для импорта, вам следует использовать опцию scripts для него и удалите его из py_modules.

Ответ 2

MANIFEST.in сообщает Distutils, какие файлы должны быть включены в исходный дистрибутив, но не влияет непосредственно на то, какие файлы установлены. Для этого вам нужно включить соответствующие файлы в файл setup.py, как правило, либо как данные пакета, либо как дополнительные файлы.

Ответ 3

Запуск python 2.6.1 на Mac OSX, мне не повезло, если не использовать параметр data_files в setup.py. Все с MANIFEST.in просто привело к тому, что файлы были включены в пакет dist, но никогда не были установлены. Я проверил некоторые другие пакеты, и они действительно использовали data_files для указания дополнительных файлов.

Я создал короткую функцию, чтобы помочь перечислить все файлы из дерева каталогов в

(target_dir, [file list]), который ожидает data_files:

def gen_data_files(*dirs):
    results = []

    for src_dir in dirs:
        for root,dirs,files in os.walk(src_dir):
            results.append((root, map(lambda f:root + "/" + f, files)))
    return results

Теперь я могу просто вызвать это в своем установочном вызове:

setup(... data_files = gen_data_files("docs", "lib") ...

И все в этих деревьях будет установлено.

Ответ 4

Я не мог понять, почему мой MANIFEST.in файл игнорировался при запуске python setup.py install - получается include_package_data=True решает проблему. Опция package_data на самом деле не требуется.

Ответ 5

Вы должны использовать setuptools:

#!/usr/bin/env python

from setuptools import setup, find_packages
from whyteboard.misc import meta


setup(
  name = 'Whyteboard',
  version = meta.version,

  packages = find_packages(),
  include_package_data=True,

  py_modules = ['whyteboard'],
  scripts = ['whyteboard.py'],
)

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