2009-04-15 14 views
7

Il mio progetto python ha un componente C++ che viene compilato e distribuito come file .pyd all'interno di un uovo Python. Ho notato che sembra essere incompatibile con solo alcuni dei nostri nuovissimi server Windows a 64 bit. Abbiamo 4 (presumibilmente) macchine con provisioning identico - ognuna di esse esegue l'edizione a 64 bit del server Windows 2003, ma 2 di queste macchine non mi consentono di chiamare le funzioni nell'uovo.Perché questo file pyd non viene importato su alcuni computer?

Dopo alcuni esperimenti sono riuscito a trovare una ricetta per producing a reproducible error. Il problema sembra verificarsi quando Python tenta di importare il file pyd.

Ho copiato il pyd in una cartella temporanea e ho eseguito Python.exe da quella posizione, per inciso stiamo ancora utilizzando l'edizione a 32 bit di Python 2.4.4 poiché nessuna delle nostre librerie è stata ancora trasferita su architettura a 64 bit. Quindi cerco di importare il mio modulo (chiamato pyccalyon). La prima volta che provo questa ottengo un messaggio di errore:

"ImportError: DLL load failed: The specified module could not be found" 

prossima volta provo questo l'interprete Python si blocca: No stacktrace a tutti!

Ovviamente si sospetta che il mio PYD - la cosa strana è che è già in uso su migliaia di PC e 10 di altri server, molti dei quali sono identici macchine spec a 64 bit. Il progetto è continuamente testato sia in fase di sviluppo che dopo l'uscita, quindi se questa cosa fosse così instabile, ne avremmo saputo molto tempo fa. Questo componente è considerato come codice stabile, quindi è sorprendente che si stia rompendo in modo così spettacolare.

Qualche suggerimento su cosa posso fare per eseguire il debug di questa libreria problematica? Le idee pazze accolgono a questo punto perché abbiamo esaurito tutti i sensati.

Grazie!

Aggiornamento 0: OK utilizzando Process Monitor Sono stato in grado di confrontare un server a 64 bit che ha esito negativo con un altro che funziona bene. Ho trovato che la rottura sembra verificarsi a causa di una DLL mancante, SysWOW64/mscoreee.dll - qualche idea di cosa sia questo componente e dove posso ottenerlo? Posso riferire questo al nostro personale di provisioning IT che può installare roba.

+0

Avete controllato che l'architettura di Python corrisponda all'architettura dei file .pyd? Si noti che l'architettura di Windows è irrilevante. Ciò che importa è che Python a 32 bit == 32-bit .pyd, o Python a 64-bit == 64-bit .pyd. –

risposta

4

Si potrebbe provare qualcosa come Process Monitor, per vedere quali DLL tenta di caricare. Suppongo che una delle altre DLL su cui si basa non possa essere trovata.

Modifica: Sembra che tu sia già riuscito a ricavarne alcune informazioni utili, ma chiarirò in che modo potresti ridurre il diluvio di informazioni che il procmon produce.

Utilizzare la funzione filtro per specificare la riga di comando (in questo caso, richiedere che la riga di comando contenga python). Questo ti mostrerà solo i messaggi del processo che ti interessa. Quindi puoi filtrare tutti i risultati di successo, così puoi vedere quale DLL sta cercando.

Ovviamente ci sono molte altre cose su cui è possibile filtrare, ma è così che ho ottenuto risultati in passato. È uno strumento davvero utile per capire cosa sta succedendo in situazioni come questa.

(Strumenti come dipendono o DependencyWalker sono anche utili per scoprire quali DLL si basano su una libreria: forniscono le informazioni statiche mentre procmon mostra la vista dinamica. Entrambi possono essere utili.)

+0

Ma il problema è che non sta caricando la DLL - Process Monitor può dirmi quali DLL non riescono a caricare? –

+0

Qual è il modo migliore di usare procmon per guardare solo le DLL che tenta di caricare - il programma ha la tendenza a spamare lo schermo! –

4

Hai provato a verificare quali DLL sono collegati da PYD? Puoi farlo ad esempio con Dependency Walker o con il file depends.exe di VS.

+0

Nessuno dei nostri server ha installato VS, c'è un altro modo per farlo? Suppongo sia possibile che la DLL venga rifiutata perché una delle sue dipendenze viene rifiutata. –

+1

Alternativa: http://www.dependencywalker.com/ – vartec

1

Forse ti mancano le DLL di runtime/libreria standard C++ sulle macchine in cui non funziona e il modulo sta cercando di usarle?

2

Secondo Microsoft's Knowledgebase, mscoree.dll fa parte di .NET Framework. Per essere precisi, è Microsoft .NET Runtime Execution Engine.

Il modo per ottenerlo sarebbe (ri) installare .NET Framework.

+0

sì mancante mscoree.dll dice che non è installato .NET. SysWOW64 è per "windows su windows-64", ovvero file per programmi a 32 bit, da eseguire in modalità WOW64 sulle macchine Windows a 64 bit. Quindi, quello che manca è la versione a 32 bit di .NET su x64 mcahine. – Hanan

0

Appena avuto lo stesso problema e depends.exe mi ha mostrato che foo.pyd è stato creato con python25.lib anziché python27.lib. Quindi non è stato possibile trovare python25.dll.

Problemi correlati