Apakah ada cara mudah untuk membuat daftar nama semua modul dalam sebuah paket, tanpa menggunakan __all__
?
Misalnya, diberikan paket ini:
/testpkg
/testpkg/__init__.py
/testpkg/modulea.py
/testpkg/moduleb.py
Saya ingin tahu apakah ada cara standar atau bawaan untuk melakukan sesuatu seperti ini:
>>> package_contents("testpkg")
['modulea', 'moduleb']
Pendekatan manual akan melakukan iterasi melalui jalur pencarian modul untuk menemukan direktori paket. Seseorang kemudian dapat membuat daftar semua file dalam direktori itu, menyaring file py / pyc / pyo yang dinamai unik, menghapus ekstensi, dan mengembalikan daftar itu. Tapi ini sepertinya cukup banyak pekerjaan untuk sesuatu yang mekanisme impor modul sudah lakukan secara internal. Apakah fungsi itu terpapar di mana saja?
imp.get_suffixes()
daripada daftar tulisan tangan Anda.xml.sax
Menggunakan python2.3 dan yang lebih baru , Anda juga bisa menggunakan
pkgutil
modul:EDIT: Perhatikan bahwa parameternya bukanlah daftar modul, tetapi daftar jalur, jadi Anda mungkin ingin melakukan sesuatu seperti ini:
sumber
pkgutil
apakah ada di python2.3 dan lebih tinggi sebenarnya . Juga, meskipkgutil.iter_modules()
tidak akan bekerja secara rekursif, adapkgutil.walk_packages()
juga, yang akan berulang. Terima kasih atas penunjuk ke paket ini.iter_modules
tidak berfungsi untuk impor absolut sepertia.b.testpkg
? Itu memberi saya[]
pkgutil.walk_packages()
berulang, itu memberi saya hasil yang sama sepertipkgutil.iter_modules()
, jadi saya pikir jawabannya tidak lengkap.sumber
help()
mencetak barang, tidak mengembalikan string.help()
kerjanya. Pokoknya, built-inpydoc
modul dapat membantu meludah keluar string yanghelp()
nomor laman:import pydoc; pydoc.render_doc('mypackage')
.Tidak tahu apakah saya melewatkan sesuatu, atau jika jawabannya hanya ketinggalan zaman tetapi;Seperti yang dinyatakan oleh user815423426 ini hanya berfungsi untuk objek hidup dan modul yang terdaftar hanya modul yang diimpor sebelumnya.
Daftar modul dalam sebuah paket tampaknya sangat mudah menggunakan inspect :
sumber
imported = import importlib; importlib.import_module('myproj.mymod.mysubmod')
.__import__
mengimpor modul level atas, lihat dokumentasi .import inspect, mypackage
dan kemudianinspect.getmembers(my_package, inspect.ismodule)
saya mendapatkan daftar kosong, meskipun saya pasti memiliki berbagai modul di dalamnya.import my_package.foo
dan tidak hanyaimport mypackage
, dalam hal ini kemudian kembalifoo
. Tapi ini mengalahkan tujuanIni adalah versi rekursif yang berfungsi dengan python 3.6 ke atas:
sumber
os.scandir
sebagai manajer konteks daripada mengulang entri hasil secara langsung?close
dipanggil saat Anda selesai menggunakannya untuk memastikan bahwa semua sumber daya yang dipegang dilepaskan.re
ia mencantumkan setiap paket tetapi menambahkanre.
ke semuanyaBerdasarkan contoh cdleary, berikut adalah jalur listingan versi rekursif untuk semua submodul:
sumber
Ini harus mencantumkan modul:
sumber
Jika Anda ingin melihat informasi tentang paket Anda di luar kode python (dari prompt perintah), Anda dapat menggunakan pydoc untuk itu.
Anda akan mendapatkan hasil yang sama dengan pydoc tetapi di dalam interpreter menggunakan bantuan
sumber
sumber
logging
paket Python untuk melihat apa yang saya maksud. Logging berisi dua modul: penangan dan konfigurasi. Kode Anda akan mengembalikan daftar 66 item, yang tidak menyertakan kedua nama itu.cetak dir (modul)
sumber