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 ...
Другие вопросы по тегам