Py2exe - win32api.pyc Ошибка загрузки DLL-файла ImportError
Я пытаюсь использовать 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.
Я гуглил по этому поводу и не нашел много, но попробовал следующие предложения безрезультатно:
Импортированные pywintypes и pythoncom до win32api (в setup.py для py2exe и в основном приложении) Добавили некоторый код в 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 ответа
Я видел эту проблему, когда пакет был построен на Vista, но выполнялся на XP. Проблема оказалась в том, что py2exe ошибочно добавлен powrprof.dll
а также mswsock.dll
к пакету. Однако Windows XP содержит свои собственные копии этих файлов и не может загрузить те Vista, которые были установлены с вашим приложением.
Удаление их из пакета сделало свое дело, вы можете сделать это легко, добавив это к options
диктовать в setup.py
'dll_excludes': [ "mswsock.dll", "powrprof.dll" ]
@Wim, я нашел немного странным то, что "добавление этого параметра в dict опций в setup.py". Если, как и я, у вас не было аргументов arg в вашем существующем вызове для настройки, это может прояснить ситуацию:
setup(name='myprog',
...
options={"py2exe":{"dll_excludes":[ "mswsock.dll", "powrprof.dll" ]}},
...
)
Так же, как добавленный комментарий. При перестройке вашей программы с Py2exe обязательно удалите старый каталог "dist". Я сидел более 3 часов, не понимая, почему мое приложение работает на моем окружении разработчика, а не на производстве. удалил dist и пересобрал с py2exe и все заработало.
Попробуйте добавить 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 ...