setup.py build不排除测试并在使用cx_Freeze时添加data_files

时间:2018-03-18 17:10:03

标签: python-3.x cx-freeze setup.py

我正在尝试为我的python gui app创建一个可执行文件,并且需要:

  • 包含许多图像和配置文件。
  • 排除unittest文件

我正在尝试将这些包含在使用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及以下版本的解决方案。

1 个答案:

答案 0 :(得分:1)

TL; DR cx_Freeze是一种特殊情况,忽略distutilssetuptools在构建轮子或源分布时使用的许多选项。重写您的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_packagestests中排除的所有子包都将被包含在内。所以排除没有效果。

Source