2009-12-21 35 views
15

sto caricamento di una DLL in pitone con codice seguente:WindowsError: [Errore 126] Il modulo specificato non è stato trovato

if os.path.exists(dll_path): 
    my_dll = ctypes.cdll.LoadLibrary(dll_path) 

Ma sto continuamente ottenendo il seguente errore

WindowsError: [ Errore 126] Impossibile trovare il modulo specificato

dll è presente nel percorso specificato, ma non ho capito perché sto ricevendo l'errore.

+0

È possibile elaborare la DLL che si sta tentando di importare e che cosa fa quella DLL? Potrebbe anche provare a caricare un'altra DLL che non riesce a trovare. – santosc

+0

La risposta a [questa domanda] (http://stackoverflow.com/questions/2334627/error-loading-dll-in-path-with-parenthesis-using-ctypes-python) l'ha risolto per me: duplicato? – Junuxx

risposta

12

Quando vedo cose come questa - di solito è perché ci sono i backslash nel percorso che viene convertito.

Per esempio - quanto segue fallirà - perché \ t nella stringa viene convertita in carattere TAB.

>>> import ctypes 
>>> ctypes.windll.LoadLibrary("c:\tools\depends\depends.dll") 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "c:\tools\python271\lib\ctypes\__init__.py", line 431, in LoadLibrary 
    return self._dlltype(name) 
    File "c:\tools\python271\lib\ctypes\__init__.py", line 353, in __init__ 
    self._handle = _dlopen(self._name, mode) 
WindowsError: [Error 126] The specified module could not be found 

ci sono 3 soluzioni (se questo è il problema)

a) Utilizzare le doppie barre ...

>>> import ctypes 
>>> ctypes.windll.LoadLibrary("c:\\tools\\depends\\depends.dll") 

b) utilizzare le barre

>>> import ctypes 
>>> ctypes.windll.LoadLibrary("c:/tools/depends/depends.dll") 

c) utilizzare stringhe RAW (precedere la stringa con r

>>> import ctypes 
>>> ctypes.windll.LoadLibrary(r"c:\tools\depends\depends.dll") 

Mentre questo terzo funziona, ho avuto l'impressione di volta in volta che non è considerato "corretto" perché le stringhe RAW erano pensate per le espressioni regolari. L'ho usato per i percorsi su Windows in Python per anni senza problemi :))

-3

Controlla il tuo nome dll .. non deve contenere alcun lettera maiuscola .. deve avere tutti i caratteri minuscoli per compilare correttamente

+0

Questo non è corretto a) di Windows I percorsi non sono case sensitive b) anche quando si utilizza ctypes.windll.dll_name - è comunque possibile utilizzare maiuscole e minuscole: '>>> ctypes.windll.UseR32.MessageBoxA' ' <_FuncPtr oggetto a 0x01DEA648> ' – markm

0

Inoltre, è possibile che tu abbia dimenticato di impostare la directory di lavoro in eclissi come locale corretto per l'esecuzione dell'applicazione.

14

Notare che anche se la DLL è nel tuo percorso. Se quella DLL si basa su altre DLL che NON sono nel tuo percorso, puoi ottenere lo stesso errore. Windows non ha trovato una dipendenza in questo caso. Windows non è veramente bravo a dirti cosa non potrebbe trovare, solo che non ha trovato qualcosa. Spetta a te per capirlo. Il percorso di ricerca DLL di Windows può essere trovato qui: http://msdn.microsoft.com/en-us/library/7d83bc18.aspx

Nel mio caso, essendo le DLL che tutti necessari erano nella stessa directory e facendo un os.chdir() per quella directory risolto il problema.

+3

Solo per dire che" os.chdir() "(mentre non sono sicuro se questo è il modo corretto di gestire il problema) mi ha aiutato dopo aver provato le opzioni menzionate nella risposta contrassegnata – JavierQQ23

+0

Un'alternativa all'utilizzo os.chdir() è per assicurarsi che la directory con le DLL sia nel tuo percorso. In entrambi i casi, Windows consente di trovare le DLL –

1

Ho incontrato lo stesso problema in Win10 sistema operativo a 32 bit. Ho risolto il problema cambiando la DLL dal debug alla versione di rilascio.

Penso che sia perché la versione di debug DLL dipende da altre DLL e la versione di rilascio no.

Problemi correlati