cx_Freeze 和 networkx 的问题

Problems with cx_Freeze and networkx

我在 Windows 上使用 64 位 python 2.7。当我用 cx_Freeze 构建一个可执行文件然后 运行 它时,我得到一个错误 window (, replace real names):

---------------------------
cx_Freeze: Python error in main script
---------------------------
Traceback (most recent call last):
  File "C:\Python27\lib\site-packages\cx_Freeze\initscripts\Console.py", line 27, in <module>
    exec(code, m.__dict__)
  File "ui.py", line 8, in <module>
  File "C:\Users\<dir_name>\<file_name>.py", line 3, in <module>
    import networkx as nx
  File "C:\Python27\lib\site-packages\networkx\__init__.py", line 87, in <module>
    import networkx.readwrite
  File "C:\Python27\lib\site-packages\networkx\readwrite\__init__.py", line 14, in <module>
    from networkx.readwrite.gml import *
  File "C:\Python27\lib\site-packages\networkx\readwrite\gml.py", line 46, in <module>
    from lib2to3.refactor import RefactoringTool
  File "C:\Python27\lib\lib2to3\refactor.py", line 27, in <module>
    from .fixer_util import find_root
  File "C:\Python27\lib\lib2to3\fixer_util.py", line 9, in <module>
    from .pygram import python_symbols as syms
  File "C:\Python27\lib\lib2to3\pygram.py", line 32, in <module>
    python_grammar = driver.load_grammar(_GRAMMAR_FILE)
  File "C:\Python27\lib\lib2to3\pgen2\driver.py", line 121, in load_grammar
    g = pgen.generate_grammar(gt)
  File "C:\Python27\lib\lib2to3\pgen2\pgen.py", line 385, in generate_grammar
    p = ParserGenerator(filename)
  File "C:\Python27\lib\lib2to3\pgen2\pgen.py", line 15, in __init__
    stream = open(filename)
IOError: [Errno 2] No such file or directory: 'C:\Users\<dir_name>\build\exe.win-amd64-2.7\library.zip\lib2to3\Grammar.txt'

---------------------------
OK   
---------------------------

存档中没有这个文件,但是如果我在构建后手动添加它,仍然找不到。看起来像是路径(反斜杠?)问题。

有人知道如何解决这个问题吗?

另外:您认为使用pyinstaller 可以更好地解决此类问题吗?我选择 cx_Freeze 的原因是 pyinstaller 本身的安装看起来非常重要,而 cx_Freeze 是一个单独的 whl。

我在使用 Py2exe 时遇到了同样的问题。

我发现问题是由 NetworkX 版本 1.10 引起的

回滚到 1.9.1 对我有用:

pip uninstall networkx
pip install networkx==1.9.1

我不得不面对同样的问题,但无法回滚到 networkx 1.9.1。

我通过从设置中排除 lib2to3 解决了这个问题,然后使用 "includefiles" 将其包含回来:

# -*- coding: cp1252 -*-

import myproj
from os.path import dirname
from cx_Freeze import setup, Executable

gui=Executable(
     script="myproj/gui.py",
     base="Win32Gui",
     targetName="myproj.exe",
     icon="logo.ico",
     )

packages=[]
includefiles=[]
includes=[]
excludes=['tkinter', 'lib2to3']

import lib2to3
lib23_path = dirname(lib2to3.__file__)
includefiles.append(lib23_path)

setup(
      name = 'myproj',
      version = myproj.version,
      author='myself',
      license='...',

      options = {'build_exe': {
                               'packages':packages,
                               'include_files':includefiles,
                               'includes':includes,
                               'excludes':excludes,
                               }},
      executables = [gui],

      )