Python Can';t运行用cx冻结创建的exe
我一直在使用一组Python脚本创建一个可执行文件。Python Can';t运行用cx冻结创建的exe,python,virtualenv,cx-freeze,Python,Virtualenv,Cx Freeze,我一直在使用一组Python脚本创建一个可执行文件。setup.py如下所示 from cx_Freeze import setup, Executable setup(name='foo', version='1.0', description='some description', options={'build_exe': {'includes': ['numpy.core._methods',
setup.py
如下所示
from cx_Freeze import setup, Executable
setup(name='foo',
version='1.0',
description='some description',
options={'build_exe': {'includes': ['numpy.core._methods',
'numpy.lib.format',
'matplotlib'],
'packages': ['matplotlib.backends.backend_agg']}},
executables=[Executable('main.py', targetName="foo.exe")])
然后从命令行调用构建
python setup.py build
这将成功并创建可执行文件以及所需的依赖项。但是,当我尝试运行应用程序时,我看到以下内容(路径已修改为删除个人信息)
显然,当结合使用
cx-freeze
、distutils
和virtualenv
(请参阅)时,这是一个已知的错误
从以上链接:
出现此问题的原因是distutils
没有将其所有模块安装到virtualenv中,它只在\uuuuuu init\uuuuu
文件中创建一个包含一些魔法代码的包,以动态导入其子模块。这是cx freeze的静态模块分析的一个问题,它在build
命令期间抱怨找不到distutils模块
上述链接中的解决方案(解决方案):
所使用的解决方法是告诉cx freeze
排除distutils
,并手动从原始解释器(而不是从virtualenv
)添加包
# contents of setup.py
from cx_Freeze import setup, Executable
import distutils
import opcode
import os
# opcode is not a virtualenv module, so we can use it to find the stdlib; this is the same
# trick used by distutils itself it installs itself into the virtualenv
distutils_path = os.path.join(os.path.dirname(opcode.__file__), 'distutils')
build_exe_options = {'include_files': [(distutils_path, 'lib/distutils')],
'excludes': ['distutils']}
setup(
name="foo",
version="0.1",
description="My app",
options={"build_exe": build_exe_options},
executables=[Executable("foo_main.py", base=None)],
)
此问题:具有相同的错误消息。
Python 3.5.4 (v3.5.4:3f56838, Aug 8 2017, 02:17:05) [MSC v.1900 64 bit (AMD64)] on win32
cx-Freeze==5.1.1
# contents of setup.py
from cx_Freeze import setup, Executable
import distutils
import opcode
import os
# opcode is not a virtualenv module, so we can use it to find the stdlib; this is the same
# trick used by distutils itself it installs itself into the virtualenv
distutils_path = os.path.join(os.path.dirname(opcode.__file__), 'distutils')
build_exe_options = {'include_files': [(distutils_path, 'lib/distutils')],
'excludes': ['distutils']}
setup(
name="foo",
version="0.1",
description="My app",
options={"build_exe": build_exe_options},
executables=[Executable("foo_main.py", base=None)],
)