Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Mencapai Pelaksanaan Tanpa Menyekat Subprocess.call dalam Python?

Bagaimana untuk Mencapai Pelaksanaan Tanpa Menyekat Subprocess.call dalam Python?

Barbara Streisand
Barbara Streisandasal
2024-10-19 13:53:02777semak imbas

How to Achieve Non-Blocking Execution of Subprocess.call in Python?

Subprocess.call Tanpa Menyekat: Mencapai Pelaksanaan Skrip Selari

Apabila melaksanakan asubprocess.call() dalam program Python, pemanggil biasanya menunggu sehingga subproses selesai sebelum meneruskan. Walau bagaimanapun, untuk aplikasi tertentu, adalah wajar untuk menjadikan subproses tidak disekat, membenarkan pemanggil meneruskan pelaksanaan semasa subproses berjalan serentak.

Senario Masalah

Pertimbangkan senario berikut: anda ingin memulakan skrip "slave.py" sebagai non-blockingsubprocess.call() daripada program "main.py" anda. Anda perlu menghantar hujah daripada "main.py" kepada "slave.py" sekali apabila yang terakhir dimulakan tetapi tidak memerlukan komunikasi lanjut antara skrip selepas itu.

Penyelesaian: subprocess.Popen

Untuk mencapai pelaksanaan tidak menyekat "slave.py," gantikan "subprocess.call()" dengan "subprocess.Popen() dalam "main.py." Daripada menunggu subprocess untuk melengkapkan, "subprocess.Popen()" kembali serta-merta, membenarkan "main.py" meneruskan operasinya.

Contoh Kod

<code class="python">import subprocess
import sys

subprocess.Popen(["python", "slave.py"] + sys.argv[1:])</code>

Alternatif: asyncio

Untuk versi Python yang lebih terbaharu (3.5 atau lebih baru), anda boleh menggunakan modul "asyncio" untuk melaksanakan panggilan subproses tidak menyekat Pendekatan ini memanfaatkan bersamaan dengan coroutine untuk melaksanakan berbilang tugas serentak.

Contoh Kod (asyncio)

<code class="python">import asyncio

async def do_subprocess():
    proc = await asyncio.create_subprocess_exec('sleep', '5')
    returncode = await proc.wait()
    print(f'Subprocess done sleeping. Return code = {returncode}')

loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.gather(do_subprocess()))
loop.close()</code>

Nota Tambahan

  • Apabila menggunakan "shell= Benar," ingat untuk mengelak daripada menggunakan senarai untuk menghantar hujah, kerana ini boleh membawa kepada kelemahan keselamatan.
  • MCVE (Contoh Boleh Disahkan Lengkap Minimal Lengkap) yang disediakan menunjukkan panggilan subproses tidak menyekat menggunakan kedua-dua "subprocess.Popen( )" dan "asyncio," mempamerkan konsep dalam suasana praktikal.

Atas ialah kandungan terperinci Bagaimana untuk Mencapai Pelaksanaan Tanpa Menyekat Subprocess.call dalam Python?. 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