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
Lepaskan: 2024-11-26 05:46:17
asal
185 orang telah melayarinya

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
)
Salin selepas log masuk

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()
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan