Apabila menggunakan subproses.Popen() untuk memanggil skrip Python yang lain, menghantar pembolehubah sebagai argumen boleh menghadapi isu yang tidak dijangka. Mari kita siasat mengapa ini mungkin berlaku dan cara menyelesaikannya.
Kod yang disediakan menunjukkan percubaan untuk melaksanakan skrip mytool.py dengan argumen yang disimpan dalam pembolehubah. Walau bagaimanapun, parameter shell=True mungkin menghalang pelaksanaan.
Penyelesaian:
Untuk mendayakan lulus pembolehubah yang berjaya, tinggalkan shell=parameter True. Di bawah persekitaran Unix, mendayakan shell=True mengubah suai cara Popen() mentafsir hujah, yang berpotensi mengakibatkan tingkah laku yang tidak diingini.
Berikut ialah coretan kod yang diubah suai yang menangani isu ini:
import sys from subprocess import Popen, PIPE # populate list of arguments args = ["mytool.py"] for opt, optname in zip("-a -x -p".split(), "address port pass".split()): args.extend([opt, str(servers[server][optname])]) args.extend("some additional command".split()) # run script p = Popen([sys.executable or 'python'] + args, stdout=PIPE) # use p.stdout here... p.stdout.close() p.wait()
Nota Keselamatan:
Menggunakan shell=True untuk arahan yang melibatkan input luaran adalah bahaya keselamatan. Seperti yang dinyatakan dalam dokumentasi Python, amalan ini tidak digalakkan kerana potensi kelemahan.
Atas ialah kandungan terperinci Mengapa Hantaran Pembolehubah Gagal dalam `subprocess.Popen()` dan Bagaimana Saya Boleh Membetulkannya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!