Rumah >pembangunan bahagian belakang >Tutorial Python >Mengapa Hantaran Pembolehubah Gagal dalam `subprocess.Popen()` dan Bagaimana Saya Boleh Membetulkannya?

Mengapa Hantaran Pembolehubah Gagal dalam `subprocess.Popen()` dan Bagaimana Saya Boleh Membetulkannya?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-28 22:17:13334semak imbas

Why Does Variable Passing Fail in `subprocess.Popen()` and How Can I Fix It?

Menyelesaikan Masalah Melepasi Pembolehubah dalam subproses. Argumen Popen()

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!

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