Isu Melepasi Pembolehubah dengan Subproses.Popen()
Apabila cuba menghantar argumen yang disimpan dalam pembolehubah kepada subproses.Popen(), sesetengah pengguna mengalami kesukaran. Ini terutamanya berlaku apabila berurusan dengan hujah seperti berikut:
servers[server]['address'] servers[server]['port'] servers[server]['pass']
Menggunakan pembolehubah ini terus ke perintah Popen() seperti yang ditunjukkan di bawah boleh membawa kepada ralat:
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 )
Penyelesaian: Lumpuhkan Pelaksanaan Shell
Untuk menyelesaikan isu ini, alih keluar shell=True hujah daripada panggilan Popen(). Ini akan menghalang hujah daripada dirawat secara khusus oleh shell, membenarkannya dihantar sebagai rentetan sebaliknya.
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()
Perhatikan bahawa menggunakan shell=True untuk arahan yang mengambil input pengguna memberikan keselamatan risiko. Sentiasa pertimbangkan kaedah alternatif untuk melindungi input pengguna daripada kemungkinan kelemahan.
Atas ialah kandungan terperinci Bagaimana untuk Meluluskan Pembolehubah dengan Betul ke `subprocess.Popen()` tanpa Shell Execution?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!