【问题标题】:Cannot run generated .exe with py2exe无法使用 py2exe 运行生成的 .exe
【发布时间】:2018-04-17 11:26:33
【问题描述】:

我正在尝试使用 py2exe 为生成 excel 的 python 脚本生成 aa .exe。这里只是一个示例代码。我正在将值 100 写入单元格并使用 openpyxl 将 excel 保存到用户桌面。当我直接运行它时,它工作得很好。

import openpyxl
import getpass

wb = openpyxl.Workbook()

ws = wb.create_sheet('test')
ws.cell(row=1, column=1, value=100)

username = getpass.getuser()

wb.save('C:\\Users\\{}\\create_exe\\gen.xlsx'.format(username))
print 'Done'

当我使用 py2exe 编译它时,它也编译得很好。 当我运行生成的 .exe 文件时出现问题。我得到一个回报说 ImportError: No module named jdcal

setup.py文件如下

import py2exe
from distutils.core import setup

packages = ["openpyxl", "openpyxl.workbook", "xml.etree", "xml"]
excludes = []

setup(console=['test_program.py'],
      options={"py2exe": {"excludes": excludes,
                          "packages": packages}}
      )

这个我已经试过了

  1. 我已经搜索过了,很少有人说使用 pip 安装 openpyxl。我 已经这样做了,pip 说它已经安装好了。
  2. 我也尝试使用 pip 安装 jdcal,pip 说它已安装。
  3. 我已卸载 jdcal 并使用 pip 手动安装它,并且 仍然是同样的错误。
  4. 我已将 jdcal 包含在包中,但结果仍然没有变化。

我希望有人可以帮助我。

提前致谢

编辑: 在dist文件夹中生成的文件如下(这里看不到openpyxl,不知道为什么)

  1. tcl(文件夹)
  2. _ctypes.pyd
  3. _elementtree.pyd
  4. _hashlib.pyd
  5. _multiprocessing.pyd
  6. _socket.pyd
  7. _ssl.pyd
  8. _tkinter.pyd
  9. bz2.pyd
  10. pyexpat.pyd
  11. select.pyd
  12. unicodedata.pyd
  13. win32ui.pyd
  14. numpy.core._dummy.pyd
  15. numpy.core.multiarray.pyd
  16. numpy.core.multiarray_tests.pyd
  17. numpy.core.operand_flag_tests.pyd
  18. numpy.core.struct_ufunc_test.pyd
  19. numpy.core.test_rational.pyd
  20. numpy.core.umath.pyd
  21. numpy.core.umath_tests.pyd
  22. numpy.fft.fftpack_lite.pyd
  23. numpy.linalg._umath_linalg.pyd
  24. numpy.linalg.lapack_lite.pyd
  25. numpy.random.mtrand.pyd
  26. _win32sysloader.pyd
  27. win32api.pyd
  28. win32pdh.pyd
  29. win32pipe.pyd
  30. tk85.dll
  31. tcl85.dll
  32. libiomp5md.dll
  33. pywintypes27.dll
  34. python27.dll
  35. w9xpopen.exe
  36. pythoncom27.dll
  37. 图书馆.zip
  38. test_program.exe(可执行文件)

【问题讨论】:

    标签: python openpyxl py2exe


    【解决方案1】:

    尝试手动将其包含在setup.pypackages = ["openpyxl", "openpyxl.workbook", "xml.etree", "xml"] 所以它会是: packages = ["openpyxl", "openpyxl.workbook", "xml.etree", "xml", "jdcal"]

    【讨论】:

    • @ Maxoz99,感谢您的回复。我也试过了。请参阅我的第 4 点。当我尝试这样做时,然后在运行 setup.py 时,我得到了错误。所以不会生成 .exe 文件。
    • @daanav 对不起,我的错,看多了。也许尝试使用不同的工具,例如 pyinstaller 或 cx_Freeze,看看你是否遇到同样的问题。
    • @daanav 还有this 说卸载和安装openpyxl 使用pip。如果您还没有尝试过,也可以试试。
    • 我尝试使用 pip 卸载并重新安装它。但是现在我的 pip 被阻止了,因为我们的大学正在使用他们不允许我与 pip 一起使用的代理。所以我现在唯一的选择是使用 pip 卸载,但使用带有 openpyxl 的 setup.py 文件安装。
    【解决方案2】:

    我个人很幸运让 py2exe 检测到所需的模块。我从来没有尝试指定每个必要的模块。 试试这个:

       from distutils.core import setup
    import py2exe
    
    setup(console=['test_program.py'])
    

    这应该从命令行运行

    python setup.py py2exe
    

    py2exe 在 dist 目录中输出 .dll 文件,这些文件必须在您运行 .exe 文件的目录中。如果你只想要一个 .exe 文件而没有 .dll 文件,试试这个:

    from distutils.core import setup
    import py2exe, sys, os
    
    sys.argv.append('py2exe')
    
    setup(
        options = {'py2exe': {'bundle_files': 1, 'compressed': True}},
        console = [{'script': "test_program.py"}],
        zipfile = None,
    )
    

    这应该从命令行运行

    python setup.py
    

    【讨论】:

    • 感谢您的回答。我也尝试过同样的方法,让 py2exe 为我确定模块和 dll。它生成exe,但是当exe运行时,它返回导入错误
    • 您能否编辑您的帖子并描述 py2exe 输出的 dist 文件夹的全部内容?另外,每次编译时删除 dist 和 build 文件夹,因为如果文件夹已经存在,它似乎会对输出产生影响。
    • 添加列表。
    【解决方案3】:

    我使用cx_freeze,从来没有遇到过任何问题。 这是 cx_freeze 文件的 setup.py

    from cx_Freeze import setup, Executable
    build_exe_options = {"excludes": ["html5lib"],"optimize":2}
    setup(name = "App Name" ,
          version = "1.0.0.0" ,
          options = {"build_exe": build_exe_options},
          description = "" ,
          executables = [Executable("FooBar.py")])
    

    【讨论】:

      猜你喜欢
      • 2012-03-08
      • 2023-04-01
      • 2012-03-27
      • 2010-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多