2010-06-03 67 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特定的。 – 2010-06-03 18:32:36

+9

您也可以在所有平台上使用'/'。请注意,如果你有像'config \ notes.txt'这样的文件,'\ n'会变成换行符!你很幸运'\ p'不代表什么。 – 2010-06-03 19:22:16

+0

@Ian Bicking - 感谢您的提示!我将它们全部用r作为前缀来注意 – froadie 2010-06-03 19:52:26

回答

25

MANIFEST.in控制在拨打python setup.py sdist时将什么文件放入分发zip文件。它确实不是控制什么安装。 data_files(或更好的package_data)控制什么文件安装(我认为也确保文件包含在zip文件中)。对于不使用Python代码的文件(如图像或模板),请使用MANIFEST.in来存放您不会安装的文件(如文档)和package_data

+5

请注意,data_files或package_data中列出的文件不会自动包含在即将发布的2.7版本之前的任何Python版本的sdist中(这是最后一次修复的distutils错误发布周期)。因此,实际上,对于当前发布的Python版本,如果您需要安装文件,则必须在MANIFEST.in中的data_files/package_data和BOTH中列出它们。 – 2010-06-10 19:19:46

+1

我注意到[3.2文档](http://docs.python.org/py3k/distutils/setupscript.html#distutils-additional-files)说“在3.1中改变:匹配package_data(或data_files)的文件会自动放入MANIFEST,如果没有提供模板。“但是,对于我来说,在WinXP 3.2上并不是这样的:我必须通过创建一个MANIFEST.in并将它们添加到其中来手动将它们放在那里。 – 2011-05-09 07:51:43

+1

这很奇怪。你能打开一个错误报告吗? – 2011-12-21 16:29:33