Py2exe - win32api.pyc 导入错误 DLL 加载失败
我正在尝试使用py2exe来分发我写的一个Python应用程序。一切看起来都很顺利,但当我在另一台机器上运行时,却出现了以下错误:
Traceback (most recent call last):
File "application.py", line 12, in <module>
File "win32api.pyc", line 12, in <module>
File "win32api.pyc", line 10, in __load
ImportError: DLL load failed: The specified procedure could not be found.
我在网上搜索过这个问题,但没有找到太多信息。不过,我尝试了以下建议,但都没有解决问题:
在win32api之前导入了pywintypes和pythoncom(在py2exe的setup.py和主应用程序中)
在setup.py中添加了一些代码 -
# ModuleFinder can't handle runtime changes to __path__, but win32com uses them
import pywintypes
import pythoncom
import win32api
try:
# if this doesn't work, try import modulefinder
import py2exe.mf as modulefinder
import win32com
for p in win32com.__path__[1:]:
modulefinder.AddPackagePath("win32com", p)
for extra in ["win32com.shell"]: #,"win32com.mapi"
__import__(extra)
m = sys.modules[extra]
for p in m.__path__[1:]:
modulefinder.AddPackagePath(extra, p)
except ImportError:
# no build path setup, no worries.
pass
我对这些东西还很陌生,所以任何帮助都将不胜感激
谢谢
乔恩
4 个回答
0
试着把win32api加到你的包里,也就是在选项字典里面。
下面是一个例子:
excludes = ["pywin", "pywin.debugger"] # there will be more in real life...
options = dict(optimize=2,
dist_dir="build",
excludes=excludes,
packages=["win32api"])
setup(
name="MyCoolApp",
options=dict(py2exe=options),
# etc ...
2
@Wim,我觉得关于“把这个加到setup.py中的options字典里”的部分有点让人困惑。如果你像我一样,在现有的setup调用中没有options参数,这样的解释可能会更清楚:
setup(name='myprog',
...
options={"py2exe":{"dll_excludes":[ "mswsock.dll", "powrprof.dll" ]}},
...
)
29
我遇到过这样的问题:一个软件包是在Vista系统上制作的,但在XP系统上运行时出现了问题。后来发现,问题出在py2exe这个工具上,它错误地把powrprof.dll
和mswsock.dll
这两个文件也打包进去了。其实,Windows XP系统本身就有这两个文件的版本,但它无法加载那些跟着你的应用程序一起安装的Vista版本。
把这两个文件从软件包中去掉就解决了这个问题。你可以通过在setup.py
文件中的options
字典里添加一些内容来轻松做到这一点。
'dll_excludes': [ "mswsock.dll", "powrprof.dll" ]