Saya memiliki skrip bernama test1.py yang tidak ada dalam modul. Itu hanya memiliki kode yang harus dijalankan ketika skrip itu sendiri dijalankan. Tidak ada fungsi, kelas, metode, dll. Saya punya skrip lain yang berjalan sebagai layanan. Saya ingin memanggil test1.py dari skrip yang menjalankan sebagai layanan.
Sebagai contoh:
File test1.py
print "I am a test"
print "see! I do nothing productive."
File service.py
# Lots of stuff here
test1.py # do whatever is in test1.py
Saya mengetahui satu metode yang membuka file, membaca konten, dan pada dasarnya mengevaluasi itu. Saya berasumsi ada cara yang lebih baik untuk melakukan ini. Atau setidaknya saya harap begitu.
runpy.run_module
jawaban ?!Jawaban:
Cara biasa untuk melakukan ini adalah seperti berikut ini.
test1.py
service.py
sumber
test1.py
terletak di direktori yang jauh?import test1
dalamservice.py
memang menjalankan seluruh naskah (yang hanya mendefinisikansome_func()
sejak__name__ == '__main__'
akanFalse
dalam kasus itu). Kedengarannya seperti semua OP ingin lakukan. Jawaban ini melampaui itu, tetapi jelas menjawab pertanyaan — dan kemudian beberapa.test1.py
tidak mengandung definisi fungsisome_func()
(melainkan hanya beberapa baris kode, misalnyaprint("hello")
) maka kode Anda tidak akan berfungsi. Dalam contoh khusus ini tidak berfungsi karena pada dasarnya Anda mengimpor fungsi eksternal yang kemudian Anda panggil kembali.Ini dimungkinkan menggunakan Python 2
Lihat dokumentasi untuk penanganan ruang nama, jika penting dalam kasus Anda.
Dalam Python 3, ini dimungkinkan menggunakan (terima kasih kepada @fantastory)
Namun, Anda harus mempertimbangkan untuk menggunakan pendekatan yang berbeda; ide Anda (dari apa yang bisa saya lihat) tidak terlihat sangat bersih.
sumber
sys.argv
daftar.Cara lain:
File test1.py:
File service.py:
Keuntungan dari metode ini adalah Anda tidak perlu mengedit skrip Python yang ada untuk meletakkan semua kodenya ke dalam subrutin.
Dokumentasi: Python 2 , Python 3
sumber
subprocess.call("./test1.py", shell=True)
untuk membuatnya bekerjashell=True
kecuali itu perlu.test1.py
harus dapat dieksekusi dan memiliki garis shebang (#!/usr/bin/env python
) dan Anda harus menentukan path lengkap atau Anda harus menyediakan sendiri executable: dicall([sys.executable, os.path.join(get_script_dir(), 'test1.py')])
managet_script_dir()
didefinisikan di sini .subprocess.call(['python', 'test1.py'])
.Jika Anda ingin test1.py tetap dapat dieksekusi dengan fungsi yang sama seperti ketika dipanggil di dalam service.py, maka lakukan sesuatu seperti:
test1.py
service.py
sumber
Menggunakan os, Anda dapat melakukan panggilan langsung ke terminal Anda. Jika Anda ingin lebih spesifik, Anda dapat menggabungkan string input Anda dengan variabel lokal, yaitu.
sumber
os.system
harus dihindari, Anda dapat melakukan hal yang sama dengan Kelas apa saja dariPopen, Call,
Anda seharusnya tidak melakukan ini. Sebaliknya, lakukan:
test1.py:
service.py
sumber
Gunakan
import test1
untuk penggunaan pertama - ini akan menjalankan skrip. Untuk pemanggilan selanjutnya, perlakukan skrip sebagai modul yang diimpor, dan panggilreload(test1)
metode tersebut.Pemeriksaan sederhana
sys.modules
dapat digunakan untuk menjalankan tindakan yang sesuai. Untuk terus merujuk ke nama skrip sebagai string ('test1'
), gunakan builtin ' impor ()' .sumber
reload
hilang dalam Python 3.if __name__ == "__main__":
penjaga. Mungkin ada perbedaan lain yang lebih halus. Jangan tinggalkan kode arbitrer di tingkat global. Masukkan ke dalam fungsi dan menyebutnya setelah impor seperti yang disarankan dalam jawaban yang diterima bukanSaya lebih suka runpy :
sumber
Mengapa tidak mengimpor test1 saja? Setiap skrip python adalah modul. Cara yang lebih baik adalah dengan memiliki fungsi misalnya main / run di test1.py, impor test1 dan jalankan test1.main (). Atau Anda dapat menjalankan test1.py sebagai subproses.
sumber
Seperti yang sudah disebutkan,
runpy
cara yang bagus untuk menjalankan skrip atau modul lain dari skrip saat ini.Ngomong-ngomong, sangat umum bagi pelacak atau debugger untuk melakukan ini, dan dalam keadaan seperti itu metode seperti mengimpor file secara langsung atau menjalankan file dalam subproses biasanya tidak berfungsi.
Itu juga perlu perhatian untuk digunakan
exec
untuk menjalankan kode. Anda harus menyediakan yang tepatrun_globals
untuk menghindari kesalahan impor atau beberapa masalah lainnya. Lihatrunpy._run_code
detailnya.sumber
Ini adalah contoh dengan
subprocess
perpustakaan:sumber
Popen
kecuali fungsi tingkat yang lebih tinggi benar-benar tidak dapat melakukan apa yang Anda inginkan. Dalam hal ini,check_call
ataurun
akan melakukan semua yang Anda butuhkan dan banyak lagi, dengan jumlah pipa yang lebih sedikit dalam kode Anda sendiri.Proses ini agak tidak ortodoks, tetapi akan bekerja di semua versi python,
Misalkan Anda ingin menjalankan skrip bernama 'recommend.py' di dalam kondisi 'jika', lalu gunakan,
Tekniknya berbeda, tetapi berhasil!
sumber