我正在尝试为我的python gui app创建一个可执行文件,并且需要:
我正在尝试将这些包含在使用setup.py进行构建中,但我似乎无法使其工作。没有添加数据文件,我的测试文件被错误地添加到linb。
我的树结构如下所示:
setup.py
mypkg/
__init__.py
gui_app.py
icons/
add.png
import.png
config/
mycfg.json
tests
__init__.py
tests.py
...
我试图用这个:
https://docs.python.org/3/distutils/setupscript.html#distutils-additional-files
我有以下内容:
from setuptools import setup, find_packages
from codecs import open
from cx_Freeze import setup, Executable
import sys
...
setup(
...
packages=find_packages(exclude=('tests', 'docs')),
executables=[Executable("./mypkg/gui_app.py", base=base)],
data_files=[('icons', ["./icons/add.png", "./icons/import.png"]),
('config', ["./config/mycfg.json"])],
...
)
有谁能建议如何使用python3.6?请不要使用python2.7或python3.5及以下版本的解决方案。
答案 0 :(得分:1)
TL; DR cx_Freeze
是一种特殊情况,忽略distutils
和setuptools
在构建轮子或源分布时使用的许多选项。重写您的setup()
来电:
setup(
...
executables=[Executable("./mypkg/gui_app.py", base=base)],
options={
'build_exe': {
'packages': find_packages(exclude=('tests', 'docs')),
'include_files': ['icons', 'config'],
}
}
)
包含许多图像和配置文件
data_files
会忽略 cx_Freeze
。相反,它使用include_files
中传递的名为options
的自己的参数。根据文档,它应该是
包含要复制到目标目录的文件的列表;预计此列表将包含源和目标的字符串或2元组;源可以是文件或目录(在这种情况下,除了.svn和CVS目录之外复制树);目标不能是绝对路径
所以你在data_files
中指定的内容变为
setup(
...
options={'build_exe': {'include_files': ['icons', 'config']}},
)
这将复制文件而不更改其相对路径。要更改它们,请传递元组中的目标路径。例如,要将icons
中的文件写入目标目录ico
:
options={'build_exe': {'include_files': [('icons', 'ico'), 'config']}}
将config/mycfg.json
写为config/othercfg.json
:
options={'build_exe': {'include_files': [('config/mycfg.json', 'config/othercfg.json')]}}
排除unittest文件
同样适用于packages
- 当传递给setup()
函数时,此选项不会对cx_Freeze
执行任何操作。请改为使用packages
参数options
:
逗号分隔要包含的包列表,其中包括包中的所有子模块
请注意,子模块是静默包含的 - 请谨慎对待列表中传递的内容,尤其是在使用find_packages()
时。例如,
find_packages(exclude=['tests.*'])
将排除tests
的所有子包,但不包括tests
本身。所以当宣布
'packages': find_packages(exclude=['tests.*'])
由于包含根包find_packages
,tests
中排除的所有子包都将被包含在内。所以排除没有效果。