Melalukan Pembolehubah ke subproses.Popen: Mengapa Ia Tidak Berfungsi dengan Argumen dalam Senarai
Apabila menggunakan subproses.Popen untuk memanggil Python yang lain skrip, anda mungkin menghadapi masalah menghantar argumen yang disimpan dalam pembolehubah. Ini boleh berlaku apabila anda cuba melaksanakan arahan seperti berikut:
p = subprocess.Popen( ["python mytool.py -a ", servers[server]['address'], "-x", servers[server]['port'], "-p", servers[server]['pass'], "some additional command"], shell=True, stdout=subprocess.PIPE )
Masalahnya:
Masalah timbul kerana penggunaan shell=True. Apabila bendera ini didayakan, hujah yang dihantar kepada Popen() dikendalikan secara berbeza pada sistem Unix. Cangkang mentafsirkan hujah sebagai rentetan arahan tunggal, yang boleh membawa kepada tingkah laku yang tidak dijangka.
Penyelesaian:
Untuk menyelesaikan isu ini, hentikan penggunaan daripada shell=True. Sebaliknya, buat senarai hujah terus dan serahkan kepada Popen(). Berikut ialah contoh:
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()
Dengan mengalih keluar shell=True dan membina senarai argumen secara manual, anda memastikan pembolehubah dihantar dengan betul kepada skrip yang dipanggil.
Awas Keselamatan:
Adalah penting untuk ambil perhatian bahawa lulus shell=True untuk arahan yang melibatkan input luaran boleh menimbulkan risiko keselamatan, seperti yang dinyatakan dalam dokumentasi subproses. Jika anda mengendalikan input yang diberikan pengguna dalam skrip anda, adalah sangat disyorkan untuk mengelak daripada menggunakan shell=True untuk mengelakkan potensi kelemahan.
Atas ialah kandungan terperinci Mengapa `subprocess.Popen` Tidak Berfungsi dengan Argumen Boleh Ubah dalam Senarai Apabila `shell=True`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!