MANIFEST.in игнорируется при установке python setup.py - файлы данных не установлены? - PullRequest
71 голосов
/ 30 августа 2010

Вот мой урезанный скрипт setup.py с удаленными некодовыми данными:

#!/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", с моими папками locale / images / и whyteboard-help / внутри. Здесь также есть мой сценарий whyteboard.py, который запускает мою программу из пакета исходного кода Whyteboard.

Итак:

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/python2.6/dist -packages /.

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

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

Ответы [ 5 ]

55 голосов
/ 30 августа 2010

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

25 голосов
/ 30 августа 2010

Некоторые примечания в дополнение к ответу Неда (который затрагивает основную проблему):

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 является просто сценарием и не предназначен для импорта, вам следует использовать для него параметр scripts и удалить его из py_modules.

22 голосов
/ 28 мая 2015

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

8 голосов
/ 02 сентября 2011

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

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

(target_dir, [список файлов]) формат, который ожидает 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") ...

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

7 голосов
/ 07 марта 2013

Вы должны использовать 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 для выполнения работы, но он включает в себя все необходимые файлы.

...