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-пакетах, так как именно так моя программа ожидает искать свои ресурсы.
как я могу вам "установить", чтобы создать эту структуру каталогов? Кажется, он игнорирует мой файл манифеста, насколько я могу судить.
5 ответов:
некоторые заметки в дополнение к ответу Неда (который попадает на основную проблему):
Distutils не устанавливает пакеты и модули Python внутри подкаталога для каждого проекта в пределах
site-packages(илиdist-packagesна Debian / Ubuntu): они устанавливаются непосредственно вsite-packages, Как вы видели. Таким образом, содержащейwhyteboard-xxкаталог в вашем sdist не будет существовать в окончательной установленной форме.одним из следствий этого является то, что вы должны быть осторожны, чтобы имя
data_filesв путь это уточняет, к какому проекту они принадлежат, потому что эти файлы / каталоги устанавливаются непосредственно в globalsite-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