0

我正在尝试为我的 python 程序构建一个可执行文件,如下所示:

from distutils.core import setup
import py2exe, sys, os 
import matplotlib
import numpy
from glob import glob

sys.argv.append('py2exe')

datafiles = [('files', glob(r'C:\Program Files\Microsoft Visual Studio 9.0\VC\redist\x86\Microsoft.VC90.CRT\*.*'))]

setup(windows=['main.py'], data_files= datafiles, options={"py2exe": {"includes": ["matplotlib"]}})

这可行,但是,我还需要包含通过此命令获得的这些 matplotlib 文件,以使程序正常工作:

matplotlib.get_py2exe_datafiles()

但不知何故,我无法将它们包含到 data_files ...

mpl = [('files', [matplotlib.get_py2exe_datafiles()])]
datafiles.append(mpl)

此外,在没有 matplotlibfiles 的情况下编译工作版本后,我收到警告说我的项目依赖于其他几个 dll - 有没有办法将它们一次全部强制到程序中?

谢谢你的帮助!

4

3 回答 3

1

可能是 matplotlib.get_py2exe_datafiles() 没有以您想要的方式返回文件吗?这个输出是什么?

也许您需要使用 list() 代替,并在您的 mpl 周围删除额外的 []:

mpl = ('files', list(matplotlib.get_py2exe_datafiles()))
datafiles.append(mpl)

docs中,完成后数据文件应该是这样的:

# data_files specifies a sequence of (directory, files) pairs in the following way:

setup(...,
      data_files=[('bitmaps', ['bm/b1.gif', 'bm/b2.gif']),
                  ('config', ['cfg/data.cfg']),
                  ('/etc/init.d', ['init-script'])]
     )
于 2012-09-04T10:14:35.983 回答
1

我有点想知道您想将该列表附加mpl到现有列表中datafiles

查看以下 py2exe-wiki-help http://www.py2exe.org/index.cgi/MatPlotLib表明您必须直接使用matpotlib.get_py2exe_datafiles()

import matplotlib
...
setup(
   ...
data_files=matplotlib.get_py2exe_datafiles(), # <-- here
)

但是您将(列表)附加mpl到仍然存在的datafiles列表中,这将导致不是一个连续的列表,而是一个矩阵:

>>> datafiles = ['<datafile_one>', '<datafile_two>']
>>> mpl = [('files', ['<mpl_file_one>', '<mpl_file_two>', ...])]
>>> print(datafiles.append(mpl)]
['<datafile_one>', '<datafile_two>', [('files', ['<mpl_file_one>',  '<mpl_file_two>', ...])]

...这似乎是不正确的。

我猜你想在你的数据文件列表中扩展(mpl你的 Visual Studio dll 文件列表(第二个索引槽),是吗?

[('files', ['<datafile_one>', '<datafile_two>', '<mpl_file_one>',  '<mpl_file_two>', ...])]

所以最后我认为你应该尝试以下方式:

datafiles = glob(r'C:\Program Files\Microsoft Visual Studio 9.0\VC\redist\x86\Microsoft.VC90.CRT\*.*'))]
datafiles.extend(matplotlib.get_py2exe_datafiles())
...
setup(windows=['main.py'], 
    data_files= [('files', datafiles)], #<-- important: tuple will be build here finally
    ...
)

-科林-

于 2012-09-04T10:18:18.843 回答
1

我设法完成了以下工作:

datafiles = [("Microsoft.VC90.CRT", glob(r'C:\Program Files\Microsoft Visual Studio 9.0\VC\redist\x86\Microsoft.VC90.CRT\*.*'))]
datafiles.extend(matplotlib.get_py2exe_datafiles()) 

setup(windows=['main.py'], data_files= datafiles, options={"py2exe": {"includes": ["matplotlib"]}})

感谢您的回复,这为我指明了正确的方向!

于 2012-09-05T11:20:24.517 回答