Soru Python'da içe aktarmadan modülün yolunu bulun


İlk önce onu ithal ederek bir modülün yolunu bulmak için çeşitli yaklaşımlar gördüm. Modülü almadan bunu yapmanın bir yolu var mı?


32
2018-01-14 16:51


Menşei


Niye ya? Neden onu almak istemiyorsun? - user225312
İthalat, yolların gerekli olduğu programda işe yaramazsa ve döngüsel bağımlılıklara ve diğer sorunlara neden olabilir. İthalat, yolun ilerisinde daha uygun bir zamanda gerçekleşir. - jeffcook2150
Ayrıca, modülde aslında herhangi bir kod çalıştırmadan kaynak koduna bakmak isteyebilirsiniz. - Leo C Han


Cevaplar:


kullanma pkgutil modülü:

>>> import pkgutil
>>> package = pkgutil.get_loader("pip")
>>> package.filename
'/usr/local/lib/python2.6/dist-packages/pip-0.7.1-py2.6.egg/pip'
>>> package = pkgutil.get_loader("threading")
>>> package.filename
'/usr/lib/python2.6/threading.py'
>>> package = pkgutil.get_loader("sqlalchemy.orm")
>>> package.filename
'/usr/lib/pymodules/python2.6/sqlalchemy/orm'

kullanma imp modülü:

>>> import imp
>>> imp.find_module('sqlalchemy')
(None, '/usr/lib/pymodules/python2.6/sqlalchemy', ('', '', 5))
>>> imp.find_module('pip')
(None, '/usr/local/lib/python2.6/dist-packages/pip-0.7.1-py2.6.egg/pip', ('', '', 5))
>>> imp.find_module('threading')
(<open file '/usr/lib/python2.6/threading.py', mode 'U' at 0x7fb708573db0>, '/usr/lib/python2.6/threading.py', ('.py', 'U', 1))

N.B: imp modülü ile size olamaz gibi bir şey yapmak imp.find_module('sqlalchmy.orm')


52
2018-01-14 16:58



Bu benim için çalıştı, teşekkürler. - jeffcook2150
@cookiecaper: mutlu yardımcı olur :) - mouad
@cgohlke: aslında onların yok pkutil paket olmalı pkgutil, bir yazım hatası oldu, onu işaret ettiğin için teşekkürler :) - mouad
@Prody: Evet, bir paket durumunda doğrudur. __init__.py paket olarak paket (docs.python.org/release/3.1.5/library/...) söyle Adlandırılmış modül henüz içe aktarılmadıysa, paketin oluşturulması için içerdiği paket (varsa) içe aktarılır. _path_ toplam anlam ifade eder :) - mouad
Psthon 3.5.1'de bulduğum paket.filename bulunamadı, ancak package.get_filename () yaptı. - Oddthinking


Bunu tercümanınızda çalıştırmayı deneyebilirsiniz:

>>> import sys
>>> sys.modules['codecs'].__file__ # codecs is just an example
'/usr/lib/python2.7/codecs.pyc'

2
2018-01-14 16:53



+1 Bir DFS veya os.system kullanarak bir şey önerebilirdim. Ama bu harika - bunun yapılmadığını bilmiyordum - inspectorG4dget
Bu, stdlib'den bazı modüller dışında çalışmaz. SQLAlchemy ile deneyin. Yine de cevabınız için teşekkürler. - jeffcook2150
Bu zaten yüklü olmayan paket için çalışmayacaktır. - mouad
Benim kötü, sadece ithal modülleri çalışır - virhilo
-1 çünkü (zaten belirtildiği gibi) aslında çalışmıyor.


Python3 için imp kullanımdan kaldırıldı. Pkgutil (yukarıda görüldüğü gibi) veya Python 3.4+ kullanımı için importlib.util.find_spec:

>>> import importlib
>>> spec = importlib.util.find_spec("threading")
>>> spec.origin
'/usr/lib64/python3.6/threading.py'

1
2018-04-10 07:46