我正在尝试使用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
我对这一切都很陌生,所以非常感谢任何帮助
由于
乔恩
答案 0 :(得分:29)
当程序包在Vista上构建但在XP上执行时,我已经看到了这个问题。问题是py2exe错误地将powrprof.dll
和mswsock.dll
添加到包中。 Windows XP虽然包含这些文件的副本,但无法加载随应用程序安装的Vista。
从包中删除它们可以解决问题,您可以通过options
setup.py
词典添加它来轻松完成此操作
'dll_excludes': [ "mswsock.dll", "powrprof.dll" ]
答案 1 :(得分:2)
@Wim,我发现有点“将它添加到setup.py中的选项dict”有点令人困惑。如果像我这样你在现有的设置调用中没有选项arg,这可能会让事情变得更清楚:
setup(name='myprog',
...
options={"py2exe":{"dll_excludes":[ "mswsock.dll", "powrprof.dll" ]}},
...
)
答案 2 :(得分: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 ...
答案 3 :(得分:0)
正如附加评论一样。使用Py2exe重建程序时,请务必删除旧的“dist”目录。我坐了3个多小时不明白为什么我的应用程序正在开发我的开发环境而不是生产环境。删除dist并使用py2exe重建它并且它有效。