如何在使用cx_freeze时捆绑其他文件?

我在Windows系统上使用Python 2.6和cx_Freeze 4.1.2。 我创build了setup.py来构build我的可执行文件,一切正常。

当cx_Freeze运行时,它将所有内容移动到构build目录。 我有一些其他的文件,我想包括在我的build立目录。 我怎样才能做到这一点? 这是我的结构。

src\ setup.py janitor.py README.txt CHNAGELOG.txt helpers\ uncompress\ unRAR.exe unzip.exe 

这是我的片段:

build立

 ( name='Janitor', version='1.0', description='Janitor', author='John Doe', author_email='john.doe@gmail.com', url='http://www.this-page-intentionally-left-blank.org/', data_files = [ ('helpers\uncompress', ['helpers\uncompress\unzip.exe']), ('helpers\uncompress', ['helpers\uncompress\unRAR.exe']), ('', ['README.txt']) ], executables = [ Executable\ ( 'janitor.py', #initScript ) ] ) 

我似乎无法得到这个工作。 我需要一个MANIFEST.in文件吗?

弄清楚了。

 from cx_Freeze import setup,Executable includefiles = ['README.txt', 'CHANGELOG.txt', 'helpers\uncompress\unRAR.exe', , 'helpers\uncompress\unzip.exe'] includes = [] excludes = ['Tkinter'] packages = ['do','khh'] setup( name = 'myapp', version = '0.1', description = 'A general enhancement utility', author = 'lenin', author_email = 'le...@null.com', options = {'build_exe': {'includes':includes,'excludes':excludes,'packages':packages,'include_files':includefiles}}, executables = [Executable('janitor.py')] ) 

注意:

  • include_files必须包含setup.py脚本的“唯一”相对path,否则构build将失败。
  • include_files可以是一个string列表,即一堆文件及其相对path
    要么
  • include_files可以是元组的列表,其中元组的前半部分是具有绝对path的文件名,后半部分是具有绝对path的目的地文件名。

(当缺less文档时,请咨询青蛙Kermit)

http://wiki.wxpython.org/cx_freeze上有一个更复杂的例子。缺less所有选项的文档在http://cx-freeze.sourceforge.net/cx_Freeze.html

使用Cx_Freeze,我仍然可以在一个文件夹中获得11个文件的构build输出,不过与Py2Exe不同。

替代scheme: http : //www.blog.pythonlibrary.org/category/packaging/

您也可以创build单独的脚本,在构build之后复制文件。 这是我用来重build窗口上的应用程序(你应该有“GNU公用事业为win32”安装,使“CP”的作品)。

运行build.bat:

 cd . del build\*.* /Q python setup.py build cp -r icons build/exe.win32-2.7/ cp -r interfaces build/exe.win32-2.7/ cp -r licenses build/exe.win32-2.7/ cp -r locale build/exe.win32-2.7/ pause 

为了find你的附加文件(include_files = [ – >你附加的文件< – ]),你应该在你的setup.py代码中插入下面的函数:

 def find_data_file(filename): if getattr(sys, 'frozen', False): # The application is frozen datadir = os.path.dirname(sys.executable) else: # The application is not frozen # Change this bit to match where you store your data files: datadir = os.path.dirname(__file__) return os.path.join(datadir, filename) 

请参阅cx-freeze:使用数据文件