Python Can';t运行用cx冻结创建的exe

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',

我一直在使用一组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',
                                          '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)],
)