2015-08-18 21 views
6

Ben interaktif Python kabuk çalışan ve bir modül 'teftiş' modülünü kullanarak içe edilmek üzere alındığı yolunu görmek için çalışıyorum. İçe aktarmaya çalıştığım modüller, SWIG kullanarak C++ API'leri etrafında Python sarmalayıcılarına sahiptir.Python modülleri (paylaşılan kütüphaneler) .py dosyası olmadan nasıl içe aktarılır?

şu pasajı adımlarımı gösterir:

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

Benim PYTHONPATHmypath1/lib/db ve mypath2/lib hem de içerir.

ben sırayla modülleri yüklemek mümkün izlenim oldu, tercüman ardından gerekli paylaşılan kitaplığı ( .so dosyası) yüklemek için imp.load_module çağıran bir .py dosyaya erişimi gerekiyor. Bu benim mypath1/lib/db altında db.py dosyası vardır db modülü durumunda gördüğümüz bir durumdur. Ancak, dart mypath2/lib altında .py dosyası bulunmamaktadır. dart modülü durumunda oluyor olarak

o .py dosyası olmadan bir modül ithal etmek mümkün mü? bu isimde bir dizin içeren ve bir __init__.py, .py kaldırılırsa bile kullanılabilen saf yerli Python modülleri ve .pyc dosyalar için bir .so dosyayı içeren herhangi bir import için birkaç farklı dosyalar için

cevap

2

Python arar.

Run strace -o trace_output.txt python bu nasıl çalıştığını görmek. import md5 için Kısmi örnek: Benim kurulum On

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 

, aslında arar:

  • ~/.local/lib/python2.7/
  • /usr/local/lib/python2.7/dist-packages
  • /usr/lib/python2.7/dist-packages
  • /usr/lib/python2.7/
Her dizin içinde 210

ardından .so dosyaları aramak için bir dizin bulmak için stat çağırmak desen, o zaman .py izlemektedir.

Tamamen yerel bir python modülü yazma hakkında daha fazla bilgi için, bkz: https://docs.python.org/2/extending/index.html

İlgili konular