使用cx_freeze和pywin32的ImportError:模块'pythoncom'不在冻结的sys.path中

时间:2013-07-26 21:09:25

标签: python-3.x pywin32 win32com cx-freeze pythoncom

我正在尝试使用cx_freeze从python3脚本在Windows 7上创建.exe。脚本涉及使用pywin32来操作Excel文件。我可以从我的setup.py文件中成功构建.exe文件;但是,当我运行.exe时,会抛出以下错误:

  

追踪(最近一次呼叫最后一次):

     

文件   “C:\ Python33 \ LIB \站点包\ cx_Freeze \启动脚本\ Console3.py”   第27行,在exec中(代码,m_ dict _)

     

文件“MyScript.py”,行   12,在<模块>

     

文件   “C:\ Python \ 64-bit \ 3.3 \ lib \ importlib_bootstrap.py”,第1558行,in   _find_and_load

     

文件“C:\ Python \ 64-bit \ 3.3 \ lib \ importlib_bootstrap.py”,第1505行,   _find_and_load_unlocked

     

文件“C:\ Python \ 64-bit \ 3.3 \ lib \ importlib_bootstrap.py”,第313行,in   _call_with_frames_removed

     

文件“C:\ Python \ 64-bit \ 3.3 \ lib \ importlib_bootstrap.py”,第1558行,   _find_and_load

     

文件“C:\ Python \ 64-bit \ 3.3 \ lib \ importlib_bootstrap.py”,第1525行,   _find_and_load_unlocked

     

文件“C:\ Python33 \ lib \ site-packages \ win32com__init __。py”,第6行,在   <模块>

     

导入pythoncom

     

文件   “C:\ Python \ 64-bit \ 3.3 \ lib \ importlib_bootstrap.py”,第1558行,in   _find_and_load

     

文件“C:\ Python \ 64-bit \ 3.3 \ lib \ importlib_bootstrap.py”,第1525行,   _find_and_load_unlocked

     

文件“C:\ Python33 \ lib \ site-packages \ pythoncom.py”,第3行,在中   pywintypes._import_pywin32_system_module _(“pythoncom”,globals())

     

文件“C:\ Python33 \ lib \ site-packages \ win32 \ lib \ pywintypes.py”,第61行,   在_import_pywin32_system_module _

中      

引发ImportError(“模块'%s'   不在冻结的sys.path%s“%(modname,sys.path))

中      

ImportError:模块'pythoncom'不在冻结的sys.path

     

[ 'C:\ Python33 \建立\ exe.win-AMD64 \ 3.3 \ MyScript.exe',

     

'C:\ Python33 \建立\ exe.win-AMD64 \ 3.3',

     

'C:\ Python33 \建立\ exe.win-AMD64 \ 3.3 \ MyScript.zip',

     

'C:\ Python33 \建立\ exe.win-AMD64 \ 3.3 \ library.zip']

以下是我的setup.py文件目前的样子:

import sys
from cx_Freeze import setup, Executable

base = None
if sys.platform == 'win32':
    base = 'Win32GUI'

includes = []
packages = []
executables = [Executable('MyScript.py', base=base)]
include_files = ['MyFolder1/','MyFolder2/Spreadsheet.xls']

setup(name='My Script',
      version='0.1',
      description='My Script',
      executables=executables,
      options = {'build_exe': {'includes':includes,
                               'packages':packages,
                               'include_msvcr':True,
                               'include_files':include_files}})

到目前为止,我已尝试在include和packages列表中列出'pythoncom'和'win32com'。非常感谢任何帮助!

3 个答案:

答案 0 :(得分:2)

所以整个问题实际上源于在运行64位版本的Python-3.3.2和Windows 7时安装了32位版本的pywin32。将pythoncom33.dll添加到我的setup.py的include_files中作为Thomas K曾建议,我还有另一个错误:

  

ImportError:DLL加载失败:%1不是有效的Win32应用程序

经过一些研究,我发现混合32位和64位时这种错误是典型的。所以我卸载了pywin32 32位并安装了pywin32 64位,但我的脚本又引发了一个错误:

  

导入win32api,sys,os

     

ImportError:DLL加载失败:找不到指定的模块。

正如this post中所建议的那样,我将29个win32 * .pyd文件从Lib / site-packages / win32文件夹复制到python.exe旁边的Python33文件夹中,一切正常。

答案 1 :(得分:1)

查看the code,您需要确保将名为pythoncom33.dll的文件复制到构建目录中。

答案 2 :(得分:0)

所以我遇到了一个类似的问题,其中cx_Freeze无法引入pywintypes DLL,但令人沮丧的是,它只是在某些机器上迫使我进一步探讨这个问题(我有一个追逐兔子的坏习惯孔)。似乎pywin32尝试将其DLL安装到Windows系统目录中,但如果由于缺少权限而失败,则会将它们放回到Python目录中。我看到的行为是因为cx_Freeze对已发现的依赖项集合应用了一个众所周知的系统文件夹路径的黑名单,以避免拉入操作系统DLL。

通过向“include_files”参数添加它们的路径来根据需要复制这些DLL确实可以解决问题(只记得你不能保证它们将被放置在系统文件夹中)。另一种解决方案是使用白名单覆盖黑名单,您可以使用“bin_includes”/“bin_path_includes”参数进行配置。这是一个快速示例,演示如何使用setup.py文件配置此参数(对于Python 2.7,但唯一的区别应该是pywintypes DLL文件名):

from cx_Freeze import setup, Executable

# This can also be an absolute path to the file if you wish to be very specific
bin_includes = ["pywintypes27.dll"]

options = {
    "build_exe": {
        "bin_includes": bin_includes
    }
}

executable = Executable(script='main.py')

setup(version='x.x.x',
      options=options,
      executables=[executable])