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

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

91
Steven Sproat 30 Авг 2010 в 03:12

5 ответов

Лучший ответ

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

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

28
Carl Meyer 30 Ноя 2015 в 20:57

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

7
Juho Rutila 7 Мар 2013 в 07:14

Запустив 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") ...

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

8
Scott Persinger 2 Сен 2011 в 19:30

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

23
Greg 27 Май 2015 в 22:34

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

60
Ned Deily 30 Авг 2010 в 01:09