Python के subprocess मॉड्यूल पर व्यापक गाइड | मूल बातें से उन्नत तक

1. Python के subprocess मॉड्यूल क्या है?

अवलोकन

Python में subprocess मॉड्यूल एक शक्तिशाली उपकरण है जो Python के भीतर सिस्टम कमांड और बाहरी प्रोग्राम चलाने की सुविधा देता है। इस मॉड्यूल का उपयोग करके आप मानक इनपुट/आउटपुट और प्रक्रियाओं को प्रबंधित कर सकते हैं, जिससे बाहरी प्रोग्राम को Python स्क्रिप्ट के साथ एकीकृत करना आसान हो जाता है। यह पारंपरिक os.system() या commands मॉड्यूल की तुलना में प्रक्रियाओं को नियंत्रित करने का अधिक सुरक्षित और लचीला तरीका प्रदान करता है।

मुख्य उपयोग केस

  • शेल कमांड चलाना : सरल सिस्टम कमांड चलाना।
  • प्रक्रिया प्रबंधन : बाहरी प्रोग्राम चलाना और मानक इनपुट/आउटपुट को पुनर्निर्देशित करना।
  • असिंक्रोनस प्रोसेसिंग : दीर्घकालिक कार्यों और समानांतर निष्पादन को प्रबंधित करना।
Ad

2. बुनियादी उपयोग: subprocess.run()

बुनियादी उपयोग

subprocess.run() फ़ंक्शन आपको Python के भीतर सिस्टम कमांड को सरल तरीके से चलाने की अनुमति देता है। उदाहरण के लिए, किसी डायरेक्टरी में फ़ाइलों की सूची प्राप्त करने के लिए आप निम्न कोड का उपयोग कर सकते हैं:

import subprocess

result = subprocess.run(['ls', '-l'], capture_output=True, text=True)
print(result.stdout)

यह कोड ls -l कमांड को चलाता है, उसका आउटपुट stdout में कैप्चर करता है, और उसे Python के भीतर प्रोसेस करता है। capture_output=True विकल्प मानक आउटपुट को कैप्चर करता है, और text=True सुनिश्चित करता है कि परिणाम को स्ट्रिंग के रूप में संभाला जाए।

त्रुटि संभालना

जब आप subprocess.run() का उपयोग करते हैं, तो आप कमांड विफल होने पर stderr के माध्यम से त्रुटि संदेश प्राप्त कर सकते हैं। इसके अतिरिक्त, आप returncode के द्वारा निष्पादन की सफलता की जाँच कर सकते हैं।

result = subprocess.run(['ls', 'nonexistentfile'], capture_output=True, text=True)
if result.returncode != 0:
    print(f"Error: {result.stderr}")

इस उदाहरण में, यदि कोई अस्तित्वहीन फ़ाइल निर्दिष्ट की जाती है, तो मानक त्रुटि के माध्यम से एक त्रुटि संदेश प्रदर्शित होगा।

Ad

3. असिंक्रोनस निष्पादन: subprocess.Popen()

Popen के साथ असिंक्रोनस प्रोसेसिंग

चूँकि subprocess.run() एक सिंक्रोनस ऑपरेशन है, इसलिए Python प्रोग्राम कमांड के पूर्ण होने तक अगले चरण पर नहीं बढ़ सकता। हालांकि, subprocess.Popen() का उपयोग करके आप प्रक्रियाओं को असिंक्रोनस रूप से चला सकते हैं और साथ‑साथ अन्य कार्य भी कर सकते हैं।

import subprocess

proc = subprocess.Popen(['sleep', '5'], stdout=subprocess.PIPE)
print("Process started")
proc.wait()
print("Process completed")

इस कोड में, sleep 5 कमांड असिंक्रोनस रूप से चलती है, जिससे यह निष्पादित होते समय अन्य कार्य जारी रह सकते हैं।

मानक इनपुट और आउटपुट को नियंत्रित करना

Popen के साथ आप मानक इनपुट और आउटपुट पुनर्निर्देशन को सटीक रूप से नियंत्रित कर सकते हैं। उदाहरण के लिए, नीचे दिया गया कोड फ़ाइल से डेटा पढ़ता है, उसे cat कमांड के साथ प्रोसेस करता है, और परिणाम को दूसरी फ़ाइल में लिखता है।

with open('input.txt', 'r') as infile, open('output.txt', 'w') as outfile:
    proc = subprocess.Popen(['cat'], stdin=infile, stdout=outfile)
    proc.wait()

यह आपको बाहरी कमांड के मानक इनपुट और आउटपुट को फ़ाइलों में पुनर्निर्देशित करके प्रोसेस करने की सुविधा देता है।

Ad

4. उपयोग केस: ऑटोमेशन स्क्रिप्ट्स

फ़ाइल बैकअप

subprocess मॉड्यूल सिस्टम प्रबंधन कार्यों और आवधिक ऑपरेशनों को स्वचालित करने में अत्यधिक उपयोगी है। उदाहरण के लिए, नीचे दिया गया स्क्रिप्ट फ़ाइलों को स्वचालित रूप से बैकअप डायरेक्टरी में कॉपी करता है:

import subprocess

files_to_backup = ['file1.txt', 'file2.txt', 'file3.txt']
backup_dir = '/backup/directory/'

for file in files_to_backup:
    subprocess.run(['cp', file, backup_dir])

यह स्क्रिप्ट निर्दिष्ट फ़ाइलों को बैकअप फ़ोल्डर में कॉपी करती है। इस प्रकार की सरल स्क्रिप्ट बनाकर नियमित बैकअप कार्यों को स्वचालित किया जा सकता है।

CI/CD पाइपलाइन में उपयोग

subprocess मॉड्यूल को निरंतर एकीकरण (CI) और निरंतर परिनियोजन (CD) वातावरण में भी व्यापक रूप से उपयोग किया जाता है। इसे ऑटोमेशन पाइपलाइन में शामिल करके टेस्ट स्क्रिप्ट चलाए जा सकते हैं और परिनियोजन प्रक्रियाओं को संभाला जा सकता है। उदाहरण के लिए, यह केवल तब अगले चरण पर बढ़ेगा जब सभी टेस्ट पास हो जाएँ।

Ad

5. सुरक्षा और सर्वोत्तम प्रथाएँ

shell=True के जोखिम


shell=True विकल्प शेल के माध्यम से कमांड निष्पादित करने के लिए उपयोग किया जाता है, लेकिन यह सुरक्षा जोखिमों के साथ आता है। विशेष रूप से जब बाहरी इनपुट को सीधे पास किया जाता है, तो शेल इंजेक्शन हमलों का खतरा होता है। shell=False का उपयोग इस जोखिम को कम करता है।

import subprocess

# Recommended usage (safe)
subprocess.run(['ls', '-l'])

# shell=True (use with caution)
subprocess.run('ls -l', shell=True)

क्रॉस-प्लेटफ़ॉर्म संगतता

सिस्टम कमांड विभिन्न ऑपरेटिंग सिस्टमों में भिन्न हो सकती हैं। आप Python के platform मॉड्यूल का उपयोग करके OS का निर्धारण कर सकते हैं और उसके अनुसार कमांड स्विच कर सकते हैं।

import platform
import subprocess

if platform.system() == "Windows":
    subprocess.run(['dir'], shell=True)
else:
    subprocess.run(['ls', '-l'])
Ad

6. समस्या निवारण और डिबगिंग

सामान्य त्रुटियां और समाधान

subprocess का उपयोग करते समय, “फ़ाइल नहीं मिली” या “अनुमति अस्वीकार” जैसी त्रुटियां सामान्य हैं। इन्हें stderr का उपयोग करके कैप्चर किया जा सकता है, और आप returncode की जांच करके त्रुटि के बारे में विवरण प्राप्त कर सकते हैं।

डिबगिंग टिप्स

check=True विकल्प कमांड विफल होने पर एक अपवाद उठाता है, जो आपको मुद्दों का जल्दी पता लगाने में मदद करता है। मानक आउटपुट और त्रुटि संदेशों को लॉगिंग के लिए कैप्चर करना डिबगिंग को भी आसान बनाता है।

import subprocess

try:
    result = subprocess.run(['ls', '-l'], check=True, capture_output=True, text=True)
    print(result.stdout)
except subprocess.CalledProcessError as e:
    print(f"An error occurred: {e}")
Ad

7. asyncio के साथ एसिंक्रोनस प्रोसेसिंग

asyncio का उपयोग करके एसिंक्रोनस प्रोसेसिंग

asyncio का उपयोग करके, आप subprocess को एसिंक्रोनस प्रोसेसिंग के साथ एकीकृत कर सकते हैं, जो कई प्रक्रियाओं को समानांतर में चलाने की अनुमति देता है। नीचे दिया गया उदाहरण ls कमांड को एसिंक्रोनस रूप से निष्पादित करता है और इसका आउटपुट कैप्चर करता है।

import asyncio
import subprocess

async def run_command():
    proc = await asyncio.create_subprocess_exec('ls', '-l',
        stdout=asyncio.subprocess.PIPE,
        stderr=asyncio.subprocess.PIPE)

    stdout, stderr = await proc.communicate()

    if stdout:
        print(f'[stdout]n{stdout.decode()}')
    if stderr:
        print(f'[stderr]n{stderr.decode()}')

asyncio.run(run_command())

यह कोड कमांड को एसिंक्रोनस रूप से निष्पादित करता है और मानक आउटपुट तथा त्रुटि आउटपुट को प्रोसेस करता है। asyncio का उपयोग एसिंक्रोनस कार्यों के कुशल प्रबंधन की अनुमति देता है।

Ad
RUNTEQ(ランテック)|超実戦型エンジニア育成スクール