Problema con il caricamento di win32file.pyd su python 2.6
-
10-07-2019 - |
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.
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"]}}
)