Rumah >pembangunan bahagian belakang >Tutorial Python >Mengapa `subprocess.Popen` Tidak Berfungsi dengan Argumen Boleh Ubah dalam Senarai Apabila `shell=True`?

Mengapa `subprocess.Popen` Tidak Berfungsi dengan Argumen Boleh Ubah dalam Senarai Apabila `shell=True`?

Linda Hamilton
Linda Hamiltonasal
2024-11-26 05:46:17202semak imbas

Why Doesn't `subprocess.Popen` Work with Variable Arguments in Lists When `shell=True`?

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn