【问题标题】:2 techniques for including files in a Python distribution: which is better?在 Python 发行版中包含文件的 2 种技术:哪个更好?
【发布时间】:2011-02-27 11:06:23
【问题描述】:

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

方法一:

在 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'])]
      )

方法二:

在 setup.py 中包含此代码:

from distutils.core import setup

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

然后,创建一个包含这一行的 MANIFEST.in 文件:

include config\* 

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

【问题讨论】:

  • 注意:使用 os.path.join 创建路径;使用“\”是特定于 Windows 的。
  • 您也可以在所有平台上使用/。请注意,如果您有像 config\notes.txt 这样的文件,那么 \n 将变成换行符!你只是幸运\p 不代表任何东西。
  • @Ian Bicking - 感谢您的提示!我在它们前面都加了一个 r 来处理这个问题

标签: python distribution distutils


【解决方案1】:

MANIFEST.in 控制在您调用 python setup.py sdist 时将哪些文件放入分发 zip 文件中。它确实控制安装的内容。 data_files(或更好的package_data)控制安装的文件(我认为还确保文件包含在zip文件中)。 MANIFEST.in 用于您不会安装的文件,例如文档,package_data 用于您使用的不是 Python 代码的文件(例如图像或模板)。

【讨论】:

  • 请注意,在即将发布的 2.7 版本之前的任何 Python 版本中,data_files 或 package_data 中列出的文件都不会自动包含在 sdist 中(这是在上一个发布周期中修复的 distutils 错误)。所以实际上,对于当前发布的 Python 版本,如果你需要安装文件,你必须在 data_files/package_data 和 MANIFEST.in 中列出它们。
  • 我注意到the 3.2 docs 说“3.1 中的更改:如果没有提供模板,匹配 package_data(或 data_files)的文件会自动放入 MANIFEST。”但是,这对我来说不是这样,在 WinXP 上的 3.2 上:我必须通过创建 MANIFEST.in 并将它们添加到其中手动将它们放在那里。
  • 这很奇怪。你能打开一个错误报告吗?
  • 糟糕,我从未提交过该报告——现在又看到了。如果可以的话,我会尝试复制并归档。不过我还是不明白:如果 MANIFEST.in 中的文件不会被安装,那么将它们放在 sdist 中有什么意义?
猜你喜欢
  • 1970-01-01
  • 2013-10-03
  • 1970-01-01
  • 2012-12-08
  • 2011-04-29
  • 1970-01-01
  • 2016-06-22
  • 2018-06-23
  • 2013-10-07
相关资源
最近更新 更多