目录结构
项目结构
1 | project/ |
非源码文件位置
三种:
- 包内, 如config.json
- 项目非包子文件下,如doc.txt
- 项目文件夹下, 如README.md, favicon.ico, LICENSE
将这些文件包含在内的几种设置
它门都被传递给setup()的参数中, 和一个文件MANIFEST.in中设置
一个文件
MANIFEST.in
文件十分重要, 后面参数的指定都因为各种原因, 需要将文件添加到这里
include_package_data = (bool)
- 决定是否打包数据, 也就是说影响的是包内的, 想config.json
当然如果愿意, 也可以在data目录下放一个__init__.py
文件, 是的其成为一个包, 尽管其中没 有任python源文件 - 需要将你需要的文件添加到
MANIFEST.in
文件中, 这是被要求的
package_data = {(str), [(str), (str)]}
像第一类文件, 除了上面的方法, 还可以使用这个参数, 这是一个更加细化的控制方式
使用了上面的参数, 则最好不要再使用这个参数
由于过去有的版本的要求, 最好将这里指定的文件也添加到
MANIFEST.in
文件中去-
1
2
3
4
5
6
7
8
9
10
11from setuptools import setup, find_packages
setup(
...
package_data = {
# 键为包, 值为glob表达式
# ""空字符串指定所有包
# 分隔符, 必须用/
'': ['*.txt', '*.rst'],
'package': ['sh/*.sh'],
}
) 注意, 修改了这个参数, 最好删除所有原来打包记录文件, 其中可能会有部分文件记录了之前指定的文件, 但在你修改了之后它们却没有正确修改
可以运行
python setup.py clean --all
访问方法
官方给出的方法并不清楚
1
2
3
4
5# 可能我们是这样访问的
foo_config = open(os.path.join(os.path.dirname(__file__),'foo.conf').read()
# 官方建议你
from pkg_resources import resource_string # 还有resource_stream
foo_config = resource_string(__name__, 'foo.conf')
exclude_package_data = {(str), [(str), (str)]}
- 这个参数用于指定那些包含在前两个参数中 (打包并安装) 打包但不安装
data_files = [((str), [(str), (str), ]), ]
总结
程序源码,依赖文件和数据文件应该分开
需要打包的文件最好都添加到
MANIFEST.in
文件中data_files指定的文件肯定不和源代码在一起
包文件由官方访问方法可知可能也会和源代码分开
事实上我在setuptools文档看到, 只要是程序运行时用到的, 都应该包含在包中
Instead, the PyPA recommends that any data files you wish to be accessible at run time be included in the package
而对data_file, setuptools文档似乎没有怎么解释, python文档则有一点说明
It is mostly useful if you need to install files which are used by other programs, which may be unaware of Python packages.