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



вот мой урезанный сценарий setup.py с non-кода вещи удалены:



#!/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 установите sdist" я получаю хороший .смола.gz с корневой папкой "whyteboard-0.41", с моей локалью/ изображениями/ и 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 установить" ни один из моих файлов данных не записывается-только исходный пакет "whyteboard" и whyteboard.py помещается в /usr/local/lib/python2.6/dist-packages/.



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



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

748   5  

5 ответов:

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

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

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

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

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

если whyteboard.py это просто скрипт, и не предназначен для импорта, то вы должны использовать скрипты опции для него, и удалить его из py_modules.

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

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

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

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

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

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

вы должны использовать 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'],
)

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

Comments

    Ничего не найдено.