2010-08-29 1 views
54

Вот мой урезанная setup.py скрипт с не-кода вещи удалены:MANIFEST.in игнорируется при установке «python setup.py install» - не установлены файлы данных?

#!/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 

Когда я бегу "питон setup.py установить sdist" Я получаю nice .tar.gz с корневой папкой «whyteboard-0.41» с моей локалью/изображениями/и справочной системой help/folders внутри. У этого также есть мой скрипт whyteboard.py, который запускает мою программу изнутри исходного пакета 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/python2.6/ Расс-пакеты /.

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

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

ответ

21

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

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.

+1

Это несчастливо. Мне не нравится идея иметь данные пакета - для меня это имеет смысл для этих ресурсов жить вне исходного каталога. Мне также не нравится иметь имена каталогов с префиксом имени программы (хотя я уже делаю это для файлов справки). Hmm .. –

48

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

+0

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

+0

Документация, связанная в этом ответе, дает вам всю необходимую информацию о том, где установлены данные и файлы pack_data. Если эти параметры не работают для вас, обновите свой вопрос с точным синтаксисом, который вы пробовали, результатами и ожидаемыми. –

+3

Это работает для меня: Дублирование моих записей MANIFEST.in внутри data.packages файла setup.py делает все сработало. Спасибо, Нед. Я не понял этого момента годами. Надеюсь, теперь мои distutils/setuptools/распространение опыта будут иметь больше смысла. –

8

Запуск 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

Это замечательно, но где он установлен? Для меня, используя «pip install», мои данные_файлы входят в корень моего virtualenv (т. Е. Один каталог, общий для всех пакетов virtualenv). Если вы используете «setup.py install», то мои данные_файлы переходят в «site- пакеты/ .egg/". Если файлы являются данными, необходимыми во время выполнения, то в любом случае тривиальным для моего кода является поиск этих файлов, и, конечно же, я должен искать обе каталоги во время выполнения. Если файлы являются моим ЛИЦЕНЗИОННЫМ файлом, то в любом случае тривиальным для моих пользователей является получение от моего источника до ЛИЦЕНЗИИ. Озадаченный. –

7

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

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

+1

Не работает для меня. Необходимо использовать файл MANIFEST – warvariuc

+0

Это работало для меня с ** setuptools **. Я создаю пакет Debian, и я вижу, что мои файлы с полянами, перечисленные в словаре 'package_data', отображаются в нужном месте только после того, как я добавил' include_package_data = Tru'. – mlt

11

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

+1

О, мой бог, я боролся с ним часами .. Большое спасибо! – DenisFLASH

 Смежные вопросы

  • Нет связанных вопросов^_^