Bisakah seseorang memberi saya cara yang baik untuk mengimpor seluruh direktori modul?
Saya memiliki struktur seperti ini:
/Foo
bar.py
spam.py
eggs.py
Saya mencoba mengubahnya menjadi paket dengan menambahkan __init__.py
dan melakukan from Foo import *
tetapi tidak berhasil seperti yang saya harapkan.
python
python-import
Evan Fosmark
sumber
sumber
Jawaban:
Daftar semua
.py
file python ( ) di folder saat ini dan masukkan sebagai__all__
variabel__init__.py
sumber
if not os.path.basename(f).startswith('_')
atau paling tidakif not f.endswith('__init__.py')
pada akhir pemahaman daftaros.path.isfile(f)
jugaTrue
. Itu akan menyaring symlink dan direktori yang rusak sepertisomedir.py/
(kasus sudut, saya akui, tapi masih ...)from . import *
setelah pengaturan__all__
jika Anda ingin submodul akan tersedia menggunakan.
(misalnya sebagaimodule.submodule1
,module.submodule2
, dll).Tambahkan
__all__
Variabel ke yang__init__.py
berisi:Lihat juga http://docs.python.org/tutorial/modules.html
sumber
os.listdir()
, beberapa pemfilteran, stripping.py
ekstensi dan__all__
.moduleName.varName
ref. stackoverflow.com/a/710603/248616Pembaruan pada 2017: Anda mungkin ingin menggunakan
importlib
.Jadikan direktori Foo paket dengan menambahkan
__init__.py
. Dalam__init__.py
add itu:Karena Anda menginginkannya dinamis (yang mungkin atau mungkin bukan ide yang bagus), daftarkan semua file py dengan dir direktori dan impor dengan sesuatu seperti ini:
Lalu, dari kode Anda, lakukan ini:
Anda sekarang dapat mengakses modul dengan
dll.
from Foo import *
bukan ide yang bagus karena beberapa alasan, termasuk bentrokan nama dan membuatnya sulit untuk menganalisis kode.sumber
__import__
hackish, saya pikir akan lebih baik untuk menambahkan nama__all__
dan kemudian meletakkannyafrom . import *
di bagian bawah script__import__
bukan untuk penggunaan umum, itu digunakan olehinterpreter
, digunakanimportlib.import_module()
sebagai gantinya.from . import eggs
dll di__init__.py
sebelum Python dapat mengimpor. Dengan hanyaimport eggs
saya dapatkanModuleNotFoundError: No module named 'eggs'
ketika mencobaimport Foo
dimain.py
dalam direktori di atas.Memperluas jawaban Mihail, saya percaya cara non-hackish (seperti dalam, tidak menangani jalur file secara langsung) adalah sebagai berikut:
__init__.py
file kosong di bawahFoo/
Anda akan mendapatkan:
sumber
RuntimeWarning
pesan juga dapat dihindari dengan tidak menggunakan full_package_name sama sekali:importer.find_module(package_name).load_module(package_name)
.RuntimeWarning
kesalahan juga dapat dihindari (dengan cara yang bisa dibilang jelek) dengan mengimpor induk (AKA dirname). Salah satu cara untuk melakukannya adalah -if dirname not in sys.modules: pkgutil.find_loader(dirname).load_module(dirname)
. Tentu saja, itu hanya berfungsi jikadirname
jalur relatif satu komponen; tidak ada garis miring. Secara pribadi, saya lebih suka pendekatan @ Artfunkel menggunakan package_name dasar sebagai gantinya.Python, sertakan semua file di bawah direktori:
Untuk pemula yang tidak bisa bekerja yang membutuhkan tangan mereka.
Buat folder / home / el / foo dan buat file di
main.py
bawah / home / el / foo Masukkan kode ini di sana:Buat direktori
/home/el/foo/hellokitty
Buat file di
__init__.py
bawah/home/el/foo/hellokitty
dan masukkan kode ini di sana:Buat dua file python:
spam.py
dan diham.py
bawah/home/el/foo/hellokitty
Tetapkan fungsi di dalam spam.py:
Tentukan fungsi di dalam ham.py:
Menjalankannya:
sumber
import *
dianggap buruk praktek pengkodean Python. Bagaimana Anda melakukan ini tanpa itu?Saya bosan dengan masalah ini sendiri, jadi saya menulis sebuah paket bernama automodinit untuk memperbaikinya. Anda bisa mendapatkannya dari http://pypi.python.org/pypi/automodinit/ .
Penggunaannya seperti ini:
automodinit
paket ke dalamsetup.py
dependensi .Itu dia! Mulai sekarang mengimpor modul akan menetapkan __all__ ke daftar file .py [co] dalam modul dan juga akan mengimpor masing-masing file tersebut seolah-olah Anda telah mengetik:
Karenanya efek "dari impor M *" sama persis dengan "impor M".
automodinit
senang berlari dari dalam arsip ZIP dan karenanya ZIP aman.Niall
sumber
Saya tahu saya memperbarui posting yang cukup lama, dan saya mencoba menggunakan
automodinit
, tetapi ternyata proses setupnya rusak untuk python3. Jadi, berdasarkan jawaban Luca, saya memberikan jawaban yang lebih sederhana - yang mungkin tidak bekerja dengan .zip - untuk masalah ini, jadi saya pikir saya harus membagikannya di sini:dalam
__init__.py
modul dariyourpackage
:dan dalam paket lain di bawah ini
yourpackage
:Maka Anda akan memiliki semua modul yang ditempatkan di dalam paket dimuat, dan jika Anda menulis modul baru, itu akan diimpor secara otomatis juga. Tentu saja, gunakan hal-hal semacam itu dengan hati-hati, dengan kekuatan besar datang tanggung jawab besar.
sumber
sumber
Saya juga mengalami masalah ini dan ini adalah solusi saya:
Fungsi ini membuat file (dalam folder yang disediakan) bernama
__init__.py
, yang berisi__all__
variabel yang menampung setiap modul di folder.Misalnya, saya memiliki folder bernama
Test
yang berisi:Jadi dalam skrip saya ingin modul diimpor ke saya akan menulis:
Ini akan mengimpor semuanya dari
Test
dan__init__.py
file dalamTest
sekarang akan berisi:sumber
Contoh Anurag dengan beberapa koreksi:
sumber
Anurag Uniyal menjawab dengan perbaikan yang disarankan!
sumber
Lihat itu
__init__.py
definisi Anda__all__
. The modul - paket doc katasumber
Ini adalah cara terbaik yang saya temukan sejauh ini:
sumber
Menggunakan
importlib
satu-satunya hal yang harus Anda tambahkan adalahsumber
error: Type of __all__ must be "Sequence[str]", not "List[Module]"
. Mendefinisikan__all__
tidak diperlukan jikaimport_module
pendekatan berbasis ini digunakan.Lihatlah modul pkgutil dari perpustakaan standar. Ini akan membiarkan Anda melakukan apa yang Anda inginkan selama Anda memiliki
__init__.py
file di direktori. The__init__.py
file dapat kosong.sumber
Saya telah membuat modul untuk itu, yang tidak bergantung pada
__init__.py
(atau file tambahan lainnya) dan membuat saya mengetik hanya dua baris berikut:Jangan ragu untuk menggunakan kembali atau berkontribusi: http://gitlab.com/aurelien-lourot/importdir
sumber
Cukup impor mereka dengan importlib dan tambahkan ke
__all__
(add
tindakan adalah opsional) secara berulang di__init__.py
paket.sumber
py
Ketika
from . import *
tidak cukup baik, ini merupakan peningkatan atas jawaban oleh ted . Secara khusus, penggunaan__all__
tidak diperlukan dengan pendekatan ini.Catatan yang
module_name not in globals()
dimaksudkan untuk menghindari pengimporan kembali modul jika sudah diimpor, karena ini dapat berisiko impor siklik.sumber