2011-12-22 11 views
6

Posso caricare i moduli Python (.py, .pyc, .pyd) da un file zip chiamando "import some_module" da un interprete Python solo dopo che sys.path è stato esteso per includere il file zip e solo dopo ho eseguitocarica file pyd da un zip da python incorporato

import zipextimporter 
zipextimporter.install() 

quest'ultimo è necessario per i moduli .pyd.

Posso anche caricare i moduli Python .py e .pyc da Python incorporato in C++. Tuttavia, al fine di caricare anche i moduli da .pyd incorporato Python ho aggiunto

PyRun_SimpleString("import zipextimporter"); 

I ++ piste exe C al di là di questa linea senza errori. Ma il successivo comando

PyRun_SimpleString("zipextimporter.install()"); 

mi dà questo errore:

enter image description here

Perché zipextimporter.install arresto() quando Python è incorporato?

Come posso risolvere questo?

Ha forse a che fare con il modo in cui è compilato il codice C++ ? Io uso g ++:

g++ embed-simple.cpp -IE:\Python27\include -LE:\Python27\libs -lpython27 -o embed-simple

ho visto un link How to link against msvcr90.dll with mingw gcc?

che potrebbe fornire una soluzione? Se sì, come dovrei regolarlo, gcc -> g ++, dato che sto eseguendo codice C++, non C.

Sto eseguendo Python 2.7.2 su WinXP.

non ottengo l'errore di runtime, dopo una nuova installazione di Python 2.7.2, proprio questo:

Import Error: No module named....

Cambierebbe qualcosa il modo in cui l'incorporamento di C++ script viene compilato? Ho usato g ++. Ho anche compilato con il compilatore Intel, ma questo ha dato lo stesso errore di runtime. Forse dovrei provare MS Visual C++.

Oppure utilizzare i tipi per importare il pyd?

+0

Ho anche inciampato su questo ... Sto cercando di importare PyCrypto e quando uso la versione integrata ottengo lo stesso errore. Bountying questo. – Chiguireitor

risposta

4

I file PYD sono file DLL nativi con estensione rinominata. Il loro caricamento si basa sulle funzionalità del sistema operativo e sulle restrizioni del sistema operativo.

Windows XP, o qualsiasi sistema operativo, per quanto ne so, non può caricare file DLL da file ZIP, quindi non è possibile caricare file PYD da file ZIP.

+1

La tua risposta sembra errata. Funziona da un interprete Python su WinXP, non da Python integrato su WinXP. –

+0

Hmmm. Devo essere in errore quindi :(Ma questa è probabilmente la causa dei problemi ... Il caricamento della DLL onora alcune regole specifiche del sistema operativo, come caricare i file DLL dalla stessa directory di EXE. Potrebbero non essere affatto laici di ZIP, ma solo "funziona per qualche motivo" Invece di modificare sys.path prova a modificare os.environ ["PATH"] che potrebbe fornire a Windows alcuni suggerimenti su dove caricare DLL da. –

+0

No. Controllato. Funziona solo da un interprete Python dopo aver corretto sys.path per includere lo zip. –

2

Quale versione di python è stata compilata per memimporter.pyd (che si trova all'interno di zipextimporter)? Se l'interprete python e pyd non corrispondono avrai dei crash orribili.

Non sono sicuro di dove sia il codice di importazione di mem, ma a un certo punto penso che l'idea è di inserire un hook di importazione che rileva un'importazione di pyd basata su zip ed estrae il pyd in una posizione temporanea e chiama l'importazione standard dell'interprete Python su questo.

+0

Penso che questo sia il codice: http://src.chromium.org/svn/trunk/tools/third_party/python_26/Lib/site-packages/zipextimporter.py ma io Sono sicuro di quale versione del memimporter di Python sia stata compilata. Come la trovo? –

+0

da dove l'hai scaricata? Di solito ti dicono sul link di download o vicino.Il link che mi hai indicato ha Python 2.6 nel suo percorso , ad esempio –

+0

Ma è possibile eseguire "import _ memimporter "da qualsiasi interprete Python. Tuttavia, potrebbe prendere zipextimporter.pyc dallo zip, che è stato generato da py2exe nel mio caso. Ho provato a regolare sys.path per mettere lo zip alla fine invece che all'inizio, cioè PyRun_SimpleString ("sys.path.insert (-1, \". \\ python27.zip \ ")"); invece di PyRun_SimpleString ("sys.path.insert (0, \". \\ python27.zip \ ")"); ma questo non ha fatto la differenza. –

5

memimporter e zipextimporter sono infatti in grado di caricare file .pyd da archivi di memoria/zip senza decomprimerli nei file.

Il runtimerror R6034 è causato dal fatto che la libreria di runtime VC9 deve essere caricata tramite un manifest. L'esecuzione del codice in Python 2.5, che utilizza un runtime C diverso, con tutta probabilità avrebbe avuto successo. Suppongo che tu debba incorporare un manifest che fa riferimento alla libreria di runtime VC9 nel tuo exe; forse il wiki py2exe può fornire alcune indicazioni.

+0

Grazie. Questo significa che se compilo il codice C + di incorporamento con Visual Studio, probabilmente funzionerà, dal momento che Visual Studio tenta di incorporare il manifest in modo predefinito? –

+0

Non so (non scrivo più programmi C/C++ ;-) – theller

+0

Sono ancora confuso. Se zipextimporter.pyc è all'interno del file zip, anche _memimporter si troverà all'interno dello zip. Ma quest'ultimo è un file .pyd che non possiamo caricare, dal momento che stiamo cercando uno strumento che ci permetta di fare proprio questo: caricare i file pyd da un zip. –

2

questo suona come lo stesso tipo di problemi che ho provato a compilare un'applicazione con py2exe. vedi qui: http://www.py2exe.org/index.cgi/Tutorial, guarda la sezione 5.2. La stessa cosa succede ... la prima volta che provi a usare memimporter, si blocca con un messaggio di errore simile. Fondamentalmente, per Python 2.6+ è necessario avere la versione esatta della libreria di runtime nel percorso e un manifest che punta ad esso. Dato che stai usando Python incorporato, non so come funzioni tutto, ma forse questo ti avvicina.

Vorrei iniziare inserendo la versione "corretta" della DLL di runtime da qualche parte e nel codice Python, prima di importare zipextimporter, aggiungere il percorso del runtime corretto a sys.path e vedere se lo risolve. non è sicuro come si ottiene il manifest in là per un python incorporato però. potrebbe essere necessario includerlo nel manifest dell'applicazione genitore.

modifica: BTW, ho dimenticato, abbiamo trovato un altro modo per aggirare questo problema. Ho dimenticato i dettagli esatti, ma quello che succede è che la tua app carica la versione predefinita del runtime, quindi Python chiede la sua versione e ne trova uno in c: \ python {26,27} e non corrisponde. Il modo più semplice per risolvere questo problema è eliminare c: \ python \ msvcr90.dll. Quindi, python non colpirà la versione locale (vecchia) della dll che potrebbe non funzionare con manifest della tua app, ed entrambi dovranno uscire e ottenere la versione corrente dalla directory windows, che corrisponderà.

Problemi correlati