无法使用py2exe运行生成的.exe

时间:2018-04-17 11:26:33

标签: python openpyxl py2exe

我正在尝试使用py2exe为生成excel的python脚本生成一个.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}}
      )

Thisngs我已经尝试了

  1. 我搜索过,很少有人说使用pip安装openpyxl。一世 已经完成了,pip说它已经安装好了。
  2. 我还尝试使用pip安装jdcal,pip说它已安装。
  3. 我已经卸载了jdcal并使用pip和手动安装它 仍然是同样的错误。
  4. 我在包中加入了jdcal,结果仍未改变。
  5. 我希望有人可以帮助我。

    提前致谢

    编辑: 生成文件在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. library.zip
    38. test_program.exe(可执行文件)

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

我个人幸运地让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

答案 2 :(得分:0)

我使用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")])