2015-08-18 16 views
6

Sto eseguendo una shell Python interattiva e sto provando a vedere il percorso da cui viene importato un modulo usando il modulo 'inspect'. I moduli che sto cercando di importare hanno wrapper Python attorno alle API C++ che usano SWIG.Come sono importati i moduli Python (che sono librerie condivise) senza un file .py?

Il seguente frammento mostra i miei passi:

>>> import os 
>>> import inspect 
>>>  
>>> import db 
>>> inspect.getfile(db) 
'mypath1/lib/db/db.pyc' 
>>> 
>>> import dart 
>>> inspect.getfile(dart) 
'mypath2/lib/dart.so' 
>>> 

mio PYTHONPATH contiene sia mypath1/lib/db e mypath2/lib.

ho avuto l'impressione che, al fine di essere in grado di caricare i moduli, l'interprete ha bisogno di accedere a un file .py che poi chiama imp.load_module per caricare la libreria condivisa necessaria (.so file). Questo è ciò che vedo nel caso del modulo db che ha un file sotto mypath1/lib/db. Tuttavia, dart non ha un file .py sotto mypath2/lib.

È possibile importare un modulo senza il file .py come accade nel caso del modulo dart?

risposta

2

ricerche Python per diversi file per un dato import tra cui una directory con quel nome e contenenti un __init__.py, un file .so per i moduli Python puri-native e .pyc file che può essere utilizzato anche se il .py viene rimosso.

Eseguire strace -o trace_output.txt python per vedere come funziona. Esempio parziale per import md5:

stat("/usr/lib/python2.7/md5", 0x7fff81ff16d0) = -1 ENOENT (No such file or directory) 
open("/usr/lib/python2.7/md5.x86_64-linux-gnu.so", O_RDONLY) = -1 ENOENT (No such file or directory) 
open("/usr/lib/python2.7/md5.so", O_RDONLY) = -1 ENOENT (No such file or directory) 
open("/usr/lib/python2.7/md5module.so", O_RDONLY) = -1 ENOENT (No such file or directory) 
open("/usr/lib/python2.7/md5.py", O_RDONLY) = 3 

Sulla mia messa a punto, in realtà cerca:

  • ~/.local/lib/python2.7/
  • /usr/local/lib/python2.7/dist-packages
  • /usr/lib/python2.7/dist-packages
  • /usr/lib/python2.7/

All'interno di ciascuna directory, viene richiamato lo schema di chiamata stat per trovare una directory, quindi cercare i file .so, quindi .py.

Per ulteriori informazioni sulla scrittura di un modulo Python puramente nativo, vedere qui: https://docs.python.org/2/extending/index.html

Problemi correlati