Apa itu Subproses dalam Python? [5 Contoh Penggunaan]
Diterbitkan: 2021-05-23Subproses memungkinkan Anda berinteraksi pada tingkat yang sama sekali baru dengan Sistem Operasi.
Komputer kami menjalankan subproses sepanjang waktu. Faktanya, hanya dengan membaca artikel ini, Anda menjalankan banyak proses seperti pengelola jaringan, atau browser internet itu sendiri.
Hal yang keren tentang ini adalah bahwa setiap tindakan yang kita lakukan di komputer kita melibatkan pemanggilan subproses. Itu tetap benar bahkan jika kita menulis skrip "hello world" sederhana dengan python.
Konsep subproses mungkin tampak tidak jelas bahkan jika Anda telah mempelajari pemrograman untuk sementara waktu. Artikel ini akan membahas secara mendalam konsep utama subproses, dan cara menggunakan pustaka standar subproses Python.
Pada akhir tutorial ini, Anda akan:
- Memahami konsep subproses
- Telah mempelajari dasar-dasar pustaka subproses Python
- Latih keterampilan Python Anda dengan contoh yang berguna
Mari kita masuk ke dalamnya
Konsep subproses
Secara garis besar, subproses adalah proses komputer yang dibuat oleh proses lain.
Kita dapat menganggap subproses sebagai pohon, di mana setiap proses induk memiliki proses anak yang berjalan di belakangnya. Saya tahu ini bisa sangat membingungkan, tetapi mari kita lihat dengan grafik sederhana.

Ada beberapa cara kita dapat memvisualisasikan proses yang berjalan di komputer kita. Misalnya, di UNIX (Linux & MAC) kami memiliki htop, yang merupakan penampil proses interaktif.

Mode pohon adalah alat yang paling berguna untuk melihat subproses yang sedang berjalan. Kita bisa mengaktifkannya dengan F5 .
Jika kita melihat lebih dekat pada bagian perintah, kita dapat melihat struktur proses yang berjalan di komputer kita.

Semuanya dimulai dengan /sbin/init yang merupakan perintah yang memulai setiap proses di komputer kita. Dari titik itu, kita dapat melihat awal dari proses lain seperti xfce4-screenshoter dan terminal xfce4 (Yang menghasilkan lebih banyak subproses)
Melihat Windows, kami memiliki pengelola tugas mitos yang hasilnya berguna saat mematikan program yang mogok di mesin kami.

Sekarang kami memiliki konsep yang sangat jelas. Mari kita lihat bagaimana kita dapat mengimplementasikan subproses dengan Python.
Subproses dalam Python
Subproses dalam Python adalah tugas yang didelegasikan oleh skrip python ke sistem Operasi (OS).
Pustaka subproses memungkinkan kita untuk mengeksekusi dan mengelola subproses langsung dari Python. Itu melibatkan bekerja dengan input standar stdin , output standar stdout , dan kode pengembalian.
Kita tidak perlu menginstalnya dengan PIP, karena ini adalah bagian dari library standar Python.
Oleh karena itu kita dapat mulai menggunakan subproses di python hanya dengan mengimpor modul.
import subprocess # Using the module ....Catatan: Untuk mengikuti artikel ini, Anda harus memiliki Python 3.5 +
Untuk memeriksa versi python yang Anda miliki saat ini, jalankan saja.
❯ python --version Python 3.9.5 # My resultJika versi Python yang Anda dapatkan adalah 2.x Anda dapat menggunakan perintah berikut:
python3 --versionMelanjutkan topik, ide utama di balik perpustakaan subproses adalah untuk dapat berinteraksi dengan OS dengan menjalankan perintah apa pun yang kita inginkan, langsung dari interpreter Python.
Itu berarti kami dapat melakukan apa pun yang kami inginkan, selama OS kami mengizinkan kami (Dan selama Anda tidak menghapus sistem file root Anda).
Mari kita lihat bagaimana menggunakannya dengan membuat skrip sederhana yang mencantumkan file dari direktori saat ini.
Aplikasi subproses pertama
Pertama, mari buat file list_dir.py . Ini akan menjadi file tempat kita akan bereksperimen dengan file daftar.
touch list_dir.pySekarang mari kita buka file itu dan gunakan kode berikut.
import subprocess subprocess.run('ls')Pertama, kita mengimpor modul subproses, dan kemudian menggunakan fungsi run yang berjalan, perintah yang kita berikan sebagai argumen.
Fungsi ini diperkenalkan di Python 3.5, sebagai jalan pintas yang ramah ke subprocess.Popen. Fungsi subprocess.run memungkinkan kita untuk menjalankan perintah dan menunggu sampai selesai, berbeda dengan Popen di mana kita memiliki opsi untuk memanggil berkomunikasi nanti.
Berbicara tentang keluaran kode, ls adalah perintah UNIX yang mencantumkan file direktori tempat Anda berada. Oleh karena itu, Jika Anda menjalankan perintah ini, Anda akan mendapatkan daftar file yang ada di direktori saat ini.
❯ python list_dir.py example.py LICENSE list_dir.py README.mdCatatan: Perhatikan bahwa jika Anda menggunakan Windows, Anda harus menggunakan perintah yang berbeda. Misalnya alih-alih menggunakan "ls" Anda dapat menggunakan "dir"
Ini mungkin tampak terlalu sederhana, dan Anda benar. Anda ingin mengambil pendekatan penuh terhadap semua kekuatan yang diberikan shell kepada Anda. Jadi mari kita pelajari cara meneruskan argumen ke shell dengan subproses.
Misalnya untuk membuat daftar juga file yang disembunyikan (Yang dimulai dengan titik), dan juga mencantumkan semua metadata file, kami menulis kode berikut.
import subprocess # subprocess.run('ls') # Simple command subprocess.run('ls -la', shell=True)Kami menjalankan perintah ini sebagai string dan menggunakan argumen Shell . Itu berarti kita memanggil shell di awal eksekusi subproses kita, dan argumen perintah diinterpretasikan langsung oleh shell.
Namun, penggunaan shell=True memiliki banyak kelemahan, dan yang terburuk adalah kemungkinan kebocoran keamanan. Anda dapat membacanya di dokumentasi resmi.
Cara terbaik untuk meneruskan perintah ke fungsi run adalah dengan menggunakan daftar di mana lst[0] adalah perintah untuk dipanggil (ls dalam kasus ini) dan lst[n] adalah argumen dari perintah itu.
Jika kita melakukannya, kode kita akan terlihat seperti ini.
import subprocess # subprocess.run('ls') # Simple command # subprocess.run('ls -la', shell=True) # Dangerous command subprocess.run(['ls', '-la'])Jika kita ingin menyimpan output standar dari subproses dalam sebuah variabel, kita dapat melakukannya dengan menyetel argumen capture_output ke true.
list_of_files = subprocess.run(['ls', '-la'], capture_output=True) print(list_of_files.stdout) ❯ python list_dir.py b'total 36\ndrwxr-xr-x 3 daniel daniel 4096 may 20 21:08 .\ndrwx------ 30 daniel daniel 4096 may 20 18:03 ..\n-rw-r--r-- 1 daniel daniel 55 may 20 20:18 example.py\ndrwxr-xr-x 8 daniel daniel 4096 may 20 17:31 .git\n-rw-r--r-- 1 daniel daniel 2160 may 17 22:23 .gitignore\n-rw-r--r-- 1 daniel daniel 271 may 20 19:53 internet_checker.py\n-rw-r--r-- 1 daniel daniel 1076 may 17 22:23 LICENSE\n-rw-r--r-- 1 daniel daniel 216 may 20 22:12 list_dir.py\n-rw-r--r-- 1 daniel daniel 22 may 17 22:23 README.md\n'Untuk mengakses output dari suatu proses, kita menggunakan atribut instance stdout .
Dalam hal ini, kami ingin menyimpan output sebagai string, bukan byte dan kami dapat melakukannya dengan menyetel argumen teks sebagai true.
list_of_files = subprocess.run(['ls', '-la'], capture_output=True, text=True) print(list_of_files.stdout) ❯ python list_dir.py total 36 drwxr-xr-x 3 daniel daniel 4096 may 20 21:08 . drwx------ 30 daniel daniel 4096 may 20 18:03 .. -rw-r--r-- 1 daniel daniel 55 may 20 20:18 example.py drwxr-xr-x 8 daniel daniel 4096 may 20 17:31 .git -rw-r--r-- 1 daniel daniel 2160 may 17 22:23 .gitignore -rw-r--r-- 1 daniel daniel 271 may 20 19:53 internet_checker.py -rw-r--r-- 1 daniel daniel 1076 may 17 22:23 LICENSE -rw-r--r-- 1 daniel daniel 227 may 20 22:14 list_dir.py -rw-r--r-- 1 daniel daniel 22 may 17 22:23 README.mdSempurna, sekarang setelah kita mengetahui dasar-dasar perpustakaan subproses , saatnya untuk beralih ke beberapa contoh penggunaan.
Contoh penggunaan subproses dalam Python
Di bagian ini, kita akan meninjau beberapa penggunaan praktis dari perpustakaan subproses. Anda dapat memeriksa semuanya di repositori Github ini.
Pemeriksa program
Salah satu kegunaan utama dari perpustakaan ini adalah kemampuan untuk membuat operasi OS sederhana.
Misalnya, skrip sederhana yang memeriksa apakah suatu program diinstal. Di Linux, kita bisa melakukan ini dengan perintah which .

'''Program checker with subprocess''' import subprocess program = 'git' process = subprocess. run(['which', program], capture_output=True, text=True) if process.returncode == 0: print(f'The program "{program}" is installed') print(f'The location of the binary is: {process.stdout}') else: print(f'Sorry the {program} is not installed') print(process.stderr)Catatan: Di UNIX ketika sebuah perintah berhasil, kode statusnya adalah 0. Jika tidak, ada yang tidak beres selama eksekusi
Karena kita tidak menggunakan argumen shell=True , kita dapat mengambil input pengguna dengan aman. Juga, kita dapat memeriksa apakah inputnya adalah program yang valid dengan pola regex.
import subprocess import re programs = input('Separe the programs with a space: ').split() secure_pattern = '[\w\d]' for program in programs: if not re.match(secure_pattern, program): print("Sorry we can't check that program") continue process = subprocess. run( ['which', program], capture_output=True, text=True) if process.returncode == 0: print(f'The program "{program}" is installed') print(f'The location of the binary is: {process.stdout}') else: print(f'Sorry the {program} is not installed') print(process.stderr) print('\n')Dalam hal ini, kami mendapatkan program dari pengguna dan menggunakan ekspresi regex yang menyatakan bahwa string program hanya menyertakan huruf dan angka. Kami memeriksa keberadaan setiap program dengan perulangan for.
Grep Sederhana dengan Python
Teman Anda Tom memiliki daftar pola dalam file teks dan file besar lainnya di mana dia ingin mendapatkan jumlah kecocokan untuk setiap pola. Dia akan menghabiskan berjam-jam menjalankan perintah grep untuk setiap pola.
Untungnya, Anda tahu cara mengatasi masalah ini dengan Python, dan Anda akan membantunya menyelesaikan tugas ini dalam beberapa detik.
import subprocess patterns_file = 'patterns.txt' readfile = 'romeo-full.txt' with open(patterns_file, 'r') as f: for pattern in f: pattern = pattern.strip() process = subprocess.run( ['grep', '-c', f'{pattern}', readfile], capture_output=True, text=True) if int(process.stdout) == 0: print( f'The pattern "{pattern}" did not match any line of {readfile}') continue print(f'The pattern "{pattern}" matched {process.stdout.strip()} times')Melihat file ini, kami mendefinisikan dua variabel yang merupakan nama file yang ingin kami kerjakan. Kemudian kami membuka file yang berisi semua pola dan mengulanginya. Selanjutnya, kita memanggil subproses yang menjalankan perintah grep dengan flag “-c” (berarti count) dan menentukan output kecocokan dengan conditional.
Jika Anda menjalankan file ini (ingat Anda dapat mengunduh file teks dari repo Github)
Siapkan virtualenv dengan subproses
Salah satu hal paling keren yang dapat Anda lakukan dengan Python adalah otomatisasi proses. Skrip semacam ini dapat menghemat waktu Anda berjam-jam per minggu.
Misalnya, kita akan membuat skrip pengaturan yang menciptakan lingkungan virtual untuk kita dan mencoba menemukan file requirements.txt di direktori saat ini untuk menginstal semua dependensi.
import subprocess from pathlib import Path VENV_NAME = '.venv' REQUIREMENTS = 'requirements.txt' process1 = subprocess.run(['which', 'python3'], capture_output=True, text=True) if process1.returncode != 0: raise OSError('Sorry python3 is not installed') python_bin = process1.stdout.strip() print(f'Python found in: {python_bin}') process2 = subprocess.run('echo "$SHELL"', shell=True, capture_output=True, text=True) shell_bin = process2.stdout.split('/')[-1] create_venv = subprocess.run([python_bin, '-m', 'venv', VENV_NAME], check=True) if create_venv.returncode == 0: print(f'Your venv {VENV_NAME} has been created') pip_bin = f'{VENV_NAME}/bin/pip3' if Path(REQUIREMENTS).exists(): print(f'Requirements file "{REQUIREMENTS}" found') print('Installing requirements') subprocess.run([pip_bin, 'install', '-r', REQUIREMENTS]) print('Process completed! Now activate your environment with "source .venv/bin/activate"') else: print("No requirements specified ...")Dalam hal ini, kami menggunakan beberapa proses dan menguraikan data yang kami butuhkan dalam skrip python kami. Kami juga menggunakan pustaka pathlib yang memungkinkan kami untuk mengetahuinya jika file requirements.txt ada.
Jika Anda menjalankan file python, Anda akan mendapatkan beberapa pesan berguna tentang apa yang terjadi dengan OS.
❯ python setup.py Python found in: /usr/bin/python3 Your venv .venv has been created Requirements file "requirements.txt" found Installing requirements Collecting asgiref==3.3.4 ....... Process completed! Now activate your environment with "source .venv/bin/activate"Perhatikan bahwa kita mendapatkan output dari proses instalasi karena kita tidak mengarahkan output standar ke variabel.
Jalankan Bahasa Pemrograman lain
Kita dapat menjalankan bahasa pemrograman lain dengan python dan mendapatkan output dari file-file tersebut. Hal ini dimungkinkan karena subproses berinteraksi langsung dengan sistem operasi.
Sebagai contoh, mari kita buat program hello world di C++ dan Java. Untuk mengeksekusi file berikut, Anda harus menginstal compiler C++ dan Java.
helloworld.cpp
#include <iostream> int main(){ std::cout << "This is a hello world in C++" << std::endl; return 0; }
helloworld.java
class HelloWorld{ public static void main(String args[]){ System.out.println("This is a hello world in Java"); } }
Saya tahu ini tampaknya banyak kode dibandingkan dengan satu baris Python sederhana, tetapi ini hanya untuk tujuan pengujian.
Kita akan membuat skrip Python yang menjalankan semua file C++ dan Java dalam sebuah direktori. Untuk melakukan ini, pertama-tama kita ingin mendapatkan daftar file tergantung pada ekstensi file, dan glob memungkinkan kita melakukannya dengan mudah!
from glob import glob # Gets files with each extension java_files = glob('*.java') cpp_files = glob('*.cpp')Setelah itu, kita dapat mulai menggunakan subproses untuk mengeksekusi setiap jenis file.
for file in cpp_files: process = subprocess.run(f'g++ {file} -o out; ./out', shell=True, capture_output=True, text=True) output = process.stdout.strip() + ' BTW this was runned by Python' print(output) for file in java_files: without_ext = file.strip('.java') process = subprocess.run(f'java {file}; java {without_ext}',shell=True, capture_output=True, text=True) output = process.stdout.strip() + ' A Python subprocess runned this :)' print(output)Satu trik kecil adalah dengan menggunakan strip fungsi string untuk memodifikasi output dan hanya mendapatkan apa yang kita butuhkan.
Catatan: Hati-hati dalam menjalankan file Java atau C++ berukuran besar karena kita sedang memuat outputnya ke dalam memori dan itu dapat menyebabkan kebocoran memori.
Buka program eksternal
Kami dapat menjalankan program lain hanya dengan memanggil lokasi binari mereka melalui subproses.
Mari kita mencobanya dengan membuka berani , browser web pilihan saya.
import subprocess subprocess.run('brave')Ini akan membuka instance browser, atau hanya tab lain jika Anda sudah menjalankan browser.

Seperti halnya program lain yang menerima flag, kita dapat menggunakannya untuk menghasilkan perilaku yang diinginkan.
import subprocess subprocess.run(['brave', '--incognito']) 
Untuk menyimpulkan
Sub-proses adalah proses komputer yang dibuat oleh proses lain. Kami dapat memeriksa proses yang dijalankan komputer kami dengan alat seperti htop dan pengelola tugas.
Python memiliki perpustakaannya sendiri untuk bekerja dengan subproses. Saat ini, fungsi run memberi kita antarmuka sederhana untuk membuat dan mengelola subproses.
Kita bisa membuat aplikasi apapun dengan mereka karena kita berinteraksi langsung dengan OS.
Terakhir, ingatlah bahwa cara terbaik untuk belajar adalah menciptakan sesuatu yang ingin Anda gunakan.
