Python subprocess मोड्युल विश्लेषण | आधारदेखि अनुप्रयोगसम्म

1. Python को subprocess मोड्युल के हो

सारांश

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

मुख्य प्रयोगहरू

  • शेल कमाण्डको कार्यान्वयन: सरल सिस्टम कमाण्डको कल।
  • प्रक्रिया व्यवस्थापन: बाह्य प्रोग्रामको कार्यान्वयन र मानक इनपुट/आउटपुटको रिडिरेक्ट।
  • असिंक्रोनस प्रक्रिया: लामो समय लाग्ने कार्यहरू वा समानान्तरमा चल्ने कार्यहरूको व्यवस्थापन।

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"त्रुटि: {result.stderr}")
यस उदाहरणमा, यदि अवस्थित नभएको फाइल निर्दिष्ट गरियो भने, मानक त्रुटिमा त्रुटि सन्देश देखाइन्छ।
侍エンジニア塾

3. असिंक्रोनस कार्यान्वयन:subprocess.Popen()

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

subprocess.run() समक्रमिक प्रक्रिया हो, त्यसैले कमाण्ड समाप्त नहुँदा Python प्रोग्राम अर्को प्रक्रियामा जान सक्दैन, तर subprocess.Popen() प्रयोग गर्दा, असिंक्रोनस रूपमा प्रक्रिया चलाउन सकिन्छ र अन्य कार्यहरू एकै साथ गर्न सकिन्छ।
import subprocess

proc = subprocess.Popen(['sleep', '5'], stdout=subprocess.PIPE)
print("प्रक्रिया सुरु भयो")
proc.wait()
print("प्रक्रिया समाप्त भयो")
यो कोडमा, 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()
यसले बाह्य कमाण्डको मानक इनपुट वा आउटपुटलाई फाइलमा रिडिरेक्ट गरेर प्रक्रिया गर्न सम्भव बनाउँछ।

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) वातावरणहरूमा पनि प्रयोग गरिन्छ, परीक्षण स्क्रिप्टको स्वचालित कार्यान्वयन र डिप्लोइ प्रक्रिया को एक भागको रूपमा समावेश गरिन्छ। उदाहरणका लागि, परीक्षण स्क्रिप्ट चलाइँदा सफल भएमा अर्को चरणमा जान सक्ने जस्तो स्वचालन सम्भव छ।

5. सुरक्षा र सर्वोत्तम अभ्यासहरू

shell=True को जोखिम

shell=True विकल्प शेल मार्फत कमाण्ड चलाउँदा प्रयोग गरिन्छ, तर यसले सुरक्षा जोखिम ल्याउँछ। विशेष गरी, बाह्य इनपुटलाई सिधै पास गर्दा शेल इन्जेक्शन आक्रमणको सम्भावना हुन्छ। shell=False प्रयोग गरेर यो जोखिमलाई कम गर्न सकिन्छ।
import subprocess

# सिफारिस गरिएको प्रयोग (सुरक्षित)
subprocess.run(['ls', '-l'])

# shell=True (ध्यान आवश्यक)
subprocess.run('ls -l', shell=True)

क्रस-प्लेटफर्म समर्थन

सिस्टम कमाण्डहरू विभिन्न OS वातावरणमा विभिन्न कमाण्डहरू प्रयोग गर्न सक्छन्। तलको जस्तै, Python को platform मोड्युल प्रयोग गरेर, चलाइने कमाण्डलाई OS अनुसार स्विच गर्न सकिन्छ।
import platform
import subprocess

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

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"त्रुटि भयो: {e}")

7. असिंक्रोनस प्रोसेसिङ र asyncio सँगको एकीकरण

asyncio प्रयोग गरेर असिंक्रोनस प्रोसेसिङ

asyncio प्रयोग गरेर, subprocess सँग एकीकृत गरी, धेरै प्रक्रियाहरूलाई समानान्तर असिंक्रोनस रूपमा प्रक्रिया गर्न सकिन्छ। तलको उदाहरणले asyncio प्रयोग गरेर 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 प्रयोग गरेर, असिंक्रोनस टास्कहरूलाई प्रभावकारी रूपमा व्यवस्थापन गर्न सकिन्छ।
RUNTEQ(ランテック)|超実戦型エンジニア育成スクール