2010-06-03 1 views
13

Я работаю над упаковкой небольшого проекта Python в виде файла zip или egg, чтобы его можно было распространять. Я столкнулся с двумя способами включения конфигурационных файлов проекта, оба из которых, похоже, дают одинаковые результаты.2 метода для включения файлов в дистрибутив Python: что лучше?

Метод 1:

Включите этот код в setup.py:

from distutils.core import setup 

setup(name='ProjectName', 
     version='1.0', 
     packages=['somePackage'], 
     data_files = [('config', ['config\propFiles1.ini', 
           'config\propFiles2.ini', 
           'config\propFiles3.ini'])] 
    ) 

Метод 2:

Включите этот код в setup.py:

from distutils.core import setup 

setup(name='ProjectName', 
     version='1.0', 
     packages=['somePackage'] 
    ) 

Затем создайте MANIFEST.in файл с этой строкой в ​​нем:

include config\* 

Есть ли разница между методами? Какой из них предпочтительнее? Я склоняюсь к первому, потому что тогда никакой файл MANIFEST.in вообще не нужен. Тем не менее, в первом методе вы должны указать каждый файл отдельно, а во втором вы можете просто включить всю папку. Есть ли что-нибудь еще, что я должен принимать во внимание? Какова стандартная практика?

+0

Примечание: используйте os.path.join для создания путей; использование «\» зависит от Windows. –

+9

Вы также можете использовать '/' на всех платформах. Обратите внимание, что если у вас есть файл типа 'config \ notes.txt',' 'nn превратится в новую строку! Вам просто повезло, что '\ p' ни на что не стоит. –

+0

@Ian Bicking - спасибо за подсказку! Я предусмотрел их все, чтобы позаботиться об этом – froadie

ответ

25

MANIFEST.in контролирует, какие файлы помещаются в дистрибутив zip-файла при вызове python setup.py sdist. Это не Управление установленным. data_files (или лучше package_data) контролирует, какие файлы установлены (и я думаю, что также файлы включены в zip-файл). Используйте MANIFEST.in для файлов, которые вы не будете устанавливать, например документации, и package_data для файлов, которые вы используете, которые не являются кодом Python (например, изображение или шаблон).

+5

. Заметьте, что файлы, перечисленные в data_files или package_data, не включаются автоматически в sdist в любой версии Python до предстоящей версии 2.7 (это ошибка distutils, которая была исправлена ​​в течение последнего цикл выпуска). Таким образом, на самом деле, для выпущенных в настоящее время версий Python, если вам нужны файлы, которые нужно установить, вы должны перечислить их BOTH в data_files/package_data И в MANIFEST.in. –

+1

Я замечаю [3.2 docs] (http://docs.python.org/py3k/distutils/setupscript.html#distutils-additional-files): «Изменено в 3.1: файлы, соответствующие package_data (или data_files), автоматически помещаются в MANIFEST, если шаблон не предоставляется ». Однако это не так для меня, в версии 3.2 на WinXP: я должен вручную добавить их туда, создав MANIFEST.in и добавив их в него. –

+1

Странно. Не могли бы вы открыть отчет об ошибке? –