在Python发行版中包含文件的两种技巧:哪一种更好?

在Python发行版中包含文件的两种技巧:哪一种更好?,python,distribution,distutils,Python,Distribution,Distutils,我正在将一个小型Python项目打包为zip或egg文件,以便可以分发。我遇到了两种包含项目配置文件的方法,这两种方法似乎产生了相同的结果 方法1: 在setup.py中包含以下代码: from distutils.core import setup setup(name='ProjectName', version='1.0', packages=['somePackage'], data_files = [('config', ['config\pr

我正在将一个小型Python项目打包为zip或egg文件,以便可以分发。我遇到了两种包含项目配置文件的方法,这两种方法似乎产生了相同的结果

方法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'])]
      )
from distutils.core import setup

setup(name='ProjectName', 
      version='1.0', 
      packages=['somePackage']
      )
方法2:

在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'])]
      )
from distutils.core import setup

setup(name='ProjectName', 
      version='1.0', 
      packages=['somePackage']
      )
然后,创建一个MANIFEST.in文件,其中包含以下行:

include config\* 

这两种方法有什么区别吗?哪一个比较好?我倾向于第一个,因为这样就根本不需要MANIFEST.in文件。但是,在第一种方法中,您必须单独指定每个文件,而在第二种方法中,您只能包含整个文件夹。还有什么我应该考虑的吗?标准做法是什么?

MANIFEST.in控制在调用
python setup.py sdist
时将哪些文件放入分发zip文件。它不控制安装的内容
data\u files
(或者更好的
package\u data
)控制安装的文件(我认为还可以确保zip文件中包含文件)。对于不安装的文件(如文档),请使用MANIFEST.in;对于非Python代码(如图像或模板)的文件,请使用
package\u data

注意:使用os.path.join创建路径;使用“\”是Windows特有的。您也可以在所有平台上使用
/
。注意:如果您有一个像
config\notes.txt
这样的文件,
\n
将变成一个换行符!你真幸运
\p
不代表任何东西。@Ian Bicking-谢谢你的提示!我在它们前面加了一个r来处理这个问题。注意,在即将发布的2.7版本之前的任何Python版本中,data_文件或package_数据中列出的文件都不会自动包含在sdist中(这是一个distutils bug,在上一个发布周期内修复)。因此,实际上,对于当前发布的Python版本,如果需要安装文件,则必须在data_files/package_data和MANIFEST中列出它们。在中,我注意到说“在3.1中更改:如果没有提供模板,则匹配package_data(或data_files)的文件将自动放入MANIFEST中。”然而,这对我来说不是真的,在WinXP的3.2上:我必须通过创建MANIFEST.in并将它们添加到其中来手动将它们放入其中。这很奇怪。你能打开一个bug报告吗?哎呀,我从来没有提交过那个报告,只是现在又看到了。我会尽量复制,如果可以的话,我会把它归档。但是我仍然不明白:如果MANIFEST.in中的文件不会被安装,那么将它们放在sdist中又有什么意义呢?