Apakah ada cara mudah untuk menemukan semua modul yang merupakan bagian dari paket python? Saya telah menemukan diskusi lama ini , yang tidak benar-benar konklusif, tetapi saya ingin memiliki jawaban yang pasti sebelum saya meluncurkan solusi saya sendiri berdasarkan os.listdir ().
python
module
packages
introspection
python-import
static_rtti
sumber
sumber
Jawaban:
Ya, Anda menginginkan sesuatu yang berdasarkan
pkgutil
atau serupa - dengan cara ini Anda dapat memperlakukan semua paket dengan sama terlepas dari apakah mereka berada dalam telur atau ritsleting atau lebih (di mana os.listdir tidak akan membantu).Bagaimana cara mengimpornya juga? Anda bisa menggunakan
__import__
seperti biasa:sumber
importer
dikembalikan oleh apapkgutil.iter_modules
? Dapatkah saya menggunakannya untuk mengimpor modul daripada menggunakan ini yang tampaknya "hackish"__import__(modname, fromlist="dummy")
?m = importer.find_module(modname).load_module(modname)
dan kemudianm
adalah modulnya, jadi misalnya:m.myfunc()
_path_
). Harus ada dua di kedua sisi, dengan total empat (yaitu__path__
).Alat yang tepat untuk pekerjaan ini adalah pkgutil.walk_packages.
Untuk mencantumkan semua modul di sistem Anda:
Ketahuilah bahwa walk_packages mengimpor semua subpaket, tetapi bukan submodul.
Jika Anda ingin membuat daftar semua submodul dari paket tertentu maka Anda dapat menggunakan sesuatu seperti ini:
iter_modules hanya mencantumkan modul dengan kedalaman satu tingkat. walk_packages mendapatkan semua submodul. Dalam kasus scipy, misalnya, walk_packages akan dikembalikan
sementara iter_modules hanya kembali
Dokumentasi di pkgutil ( http://docs.python.org/library/pkgutil.html ) tidak mencantumkan semua fungsi menarik yang didefinisikan di /usr/lib/python2.6/pkgutil.py.
Mungkin ini berarti fungsi tersebut bukan bagian dari antarmuka "publik" dan dapat berubah.
Namun, setidaknya pada Python 2.6 (dan mungkin versi sebelumnya?) Pkgutil hadir dengan metode walk_packages yang secara rekursif berjalan melalui semua modul yang tersedia.
sumber
walk_packages
sekarang ada di dokumentasi: docs.python.org/library/pkgutil.html#pkgutil.walk_packages_
) sebelum dan sesudahpath
- yaitu, gunakanpackage.__path__
daripadapackage._path_
. Mungkin lebih mudah untuk mencoba memotong & menempel kode daripada mengetik ulang.package
mengarah ke paket, bukan modul. Modul adalah file sedangkan paket adalah direktori. Semua paket memiliki__path__
atribut (... kecuali seseorang menghapus atribut karena suatu alasan.)Ini bekerja untuk saya:
sumber
Saya sedang mencari cara untuk memuat ulang semua submodul yang saya edit langsung di paket saya. Ini adalah kombinasi dari jawaban / komentar di atas, jadi saya memutuskan untuk mempostingnya di sini sebagai jawaban daripada komentar.
sumber
Inilah salah satu cara, di luar kepala saya:
Itu pasti bisa dibersihkan dan diperbaiki.
EDIT: Ini versi yang sedikit lebih bagus:
CATATAN: Ini juga akan menemukan modul yang mungkin tidak selalu terletak di subdirektori paket, jika mereka ditarik dalam
__init__.py
filenya, jadi itu tergantung pada apa yang Anda maksud dengan "bagian dari" sebuah paket.sumber