Saya memiliki program Python yang sedang saya bangun yang dapat dijalankan dengan salah satu dari 2 cara: yang pertama adalah memanggil "python main.py" yang meminta pengguna untuk input dengan cara yang ramah dan kemudian menjalankan input pengguna melalui program. Cara lain adalah memanggil "python batch.py -file- " yang akan melewati semua pengumpulan input yang ramah dan menjalankan seluruh input file melalui program dalam sekali jalan.
Masalahnya adalah ketika saya menjalankan "batch.py" ia mengimpor beberapa variabel / metode / etc dari "main.py", dan ketika menjalankan kode ini:
import main
pada baris pertama program, program langsung error karena mencoba menjalankan kode di "main.py".
Bagaimana saya bisa menghentikan Python dari menjalankan kode yang terdapat dalam modul "main" yang saya impor?
sumber
Karena cara kerja Python, perlu untuk menjalankan modul Anda ketika mengimpornya.
Agar kode dalam modul tidak dieksekusi ketika diimpor, tetapi hanya ketika dijalankan secara langsung, Anda dapat menjaganya dengan ini
if
:Anda mungkin ingin meletakkan kode ini dalam suatu
main()
metode, sehingga Anda dapat mengeksekusi file secara langsung, atau mengimpor modul dan memanggilmain()
. Misalnya, anggap ini ada dalam filefoo.py
.Program ini dapat dijalankan dengan pergi
python foo.py
, atau dari skrip Python lain:sumber
Use the
if __name__ == '__main__'
idiom -__name__
adalah variabel khusus yang nilainya'__main__'
jika modul dijalankan sebagai skrip, dan nama modul jika itu diimpor. Jadi, Anda akan melakukan sesuatu sepertisumber
Sayangnya, kamu tidak. Itu adalah bagian dari cara sintaks impor bekerja dan penting untuk melakukannya - ingat
def
sebenarnya adalah sesuatu yang dieksekusi, jika Python tidak menjalankan impor, Anda akan, yah, terjebak tanpa fungsi.Karena Anda mungkin memiliki akses ke file, Anda mungkin dapat melihat dan melihat apa yang menyebabkan kesalahan. Dimungkinkan untuk memodifikasi lingkungan Anda untuk mencegah kesalahan terjadi.
sumber
Masukkan kode di dalam fungsi dan itu tidak akan berjalan sampai Anda memanggil fungsi. Anda harus memiliki fungsi utama di
main.py
. dengan pernyataan:Kemudian, jika Anda memanggil
python main.py
yangmain()
fungsi akan berjalan. Jika Anda mengimpormain.py
, itu tidak akan. Juga, Anda mungkin harus mengganti namamain.py
menjadi sesuatu yang lain demi kejelasan.sumber
Ada proposal peningkatan Python PEP 299 yang bertujuan untuk mengganti
if __name__ == '__main__':
idiom dengandef __main__:
, tetapi ditolak. Ini masih merupakan bacaan yang baik untuk mengetahui apa yang harus diingat ketika menggunakanif __name__ = '__main__':
.sumber
Anda dapat menulis "main.py" Anda seperti ini:
sumber
Meskipun Anda tidak dapat menggunakan
import
tanpa menjalankan kode; ada cara yang cukup cepat di mana Anda dapat memasukkan variabel Anda; dengan menggunakannumpy.savez
, yang menyimpan variabel sebagai array numpy dalam file .npz. Setelah itu Anda dapat memuat variabel menggunakannumpy.load
.Lihat deskripsi lengkap dalam dokumentasi yang lemah
Harap dicatat ini hanya untuk variabel dan array variabel, dan bukan untuk metode, dll.
sumber
Coba impor saja fungsi yang diperlukan dari main.py? Begitu,
Bisa jadi Anda telah menamai fungsi dalam batch.py sama dengan yang ada di main.py, dan ketika Anda mengimpor main.py program menjalankan fungsi main.py alih-alih fungsi batch.py; melakukan hal di atas akan memperbaikinya. Saya harap.
sumber
import main
TIDAK mengimpor semuanya dari main ke namespace saat ini. Itu hanya menambahkan satumain
simbol di namespace saat ini, sehingga tabrakan tidak dapat terjadi.