Domanda

Non riesco a fare in modo che py2exe comprima correttamente anche un semplice script che utilizza win32file Ricevo costantemente il seguente messaggio di errore:

Traceback (most recent call last):
  File "dependency_checker.py", line 1, in <module>
  File "win32file.pyc", line 12, in <module>
  File "win32file.pyc", line 10, in __load
ImportError: DLL load failed: The specified procedure could not be found.

Lo script ha il seguente aspetto:

import win32file
print "Hello world!"

Ed ecco setup.py:

from distutils.core import setup
import py2exe
setup(console=['dependency_checker.py'])

Hai mai avuto problemi simili prima?

Versioni:

Python 2.6.2, py2exe 0.6.9, pywin32-214, Windows 7 e Windows XP Pro come macchina di destinazione

UPDATE:

  • Posso eseguire il programma in bundle sul mio Windows 7 dove è stato creato ma non posso eseguirlo sulla macchina XP.
  • La parte di win32file.pyc che genera l'errore ha il seguente aspetto:

    >>> imp.load_dynamic('win32file', r'C:\test\setup-test\src\dist\win32file.pyd')
    

La riga sopra sulla mia casella di sviluppo (Windows 7) funziona correttamente mentre sulla casella di test (Windows XP) restituisce l'errore.

** AGGIORNAMENTO 2: **

Quando uso imp.load_dynamic per caricare l'installazione di python da win32file, posso ricaricare win32file.pyd per la cartella dist senza l'errore.

È stato utile?

Soluzione

La soluzione è stata quella di rimuovere MSWSOCK.dll che è stato copiato nella directory dist da py2exe in modo errato.

Ho usato procmon e listdll per controllare cosa viene caricato da win32file.pyd quando l'importazione ha esito positivo e quali dll vengono caricate quando l'importazione non riesce. Quindi avendo l'elenco delle dll ho verificato se sono state caricate correttamente, ad es. dll python dalla cartella dist e dll windows dalla cartella windows.

Ecco setup.py che funziona bene

from distutils.core import setup
import py2exe
setup(console=['dependency_checker.py'],
     options={'py2exe': {"dll_excludes": ["mswsock.dll", "MSWSOCK.dll"]}}
     )
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top