जवाबों:
उपप्रक्रिया मॉड्यूल तुम बाहर में मदद मिलेगी।
स्पष्ट रूप से तुच्छ उदाहरण:
>>> import subprocess
>>> subprocess.call(['./test.sh']) # Thanks @Jim Dennis for suggesting the []
0
>>>
जहां test.sh
एक सरल शेल स्क्रिप्ट है और 0
इस रन के लिए उसका रिटर्न वैल्यू है।
chmod +x script.sh
,। नोट: script.sh आपकी स्क्रिप्ट के लिए एक प्लेसहोल्डर है, इसे उसी के अनुसार बदलें।
उपयोग करने के कुछ तरीके os.popen()
(पदावनत) या पूरे subprocess
मॉड्यूल हैं, लेकिन यह दृष्टिकोण है
import os
os.system(command)
सबसे आसान में से एक है।
subprocess
आप इनपुट / आउटपुट / त्रुटि पाइप प्रबंधन कर सकते हैं। जब आपके पास कई तर्क होते हैं तो यह भी बेहतर है - os.command()
आपके पास विशेष वर्णों से बचने के साथ पूरी कमांड लाइन बनानी होगी, जिसमें subprocess
तर्कों की सरल सूची होगी। लेकिन सरल कार्यों के os.command()
लिए बस पर्याप्त हो सकता है।
The subprocess module provides more powerful facilities for spawning new processes and retrieving their results; *using that module is preferable to using this function.*
यदि आप अपनी शेल स्क्रिप्ट में कुछ पैरामीटर पास करना चाहते हैं, तो आप विधि shlex.split () का उपयोग कर सकते हैं :
import subprocess
import shlex
subprocess.call(shlex.split('./test.sh param1 param2'))
साथ test.sh
ही फ़ोल्डर में:
#!/bin/sh
echo $1
echo $2
exit 0
आउटपुट:
$ python test.py
param1
param2
import os
import sys
Test.sh मान लें कि शेल स्क्रिप्ट है जिसे आप निष्पादित करना चाहते हैं
os.system("sh test.sh")
उपप्रोसेस मॉड्यूल का उपयोग करें जैसा कि ऊपर बताया गया है।
मैं इसे इस तरह से उपयोग करता हूं:
subprocess.call(["notepad"])
मैं अजगर 3.5 और सबप्रोसेस.लाल चला रहा हूं। (['./ test.sh']) मेरे लिए काम नहीं करता है।
मैं आपको तीन समाधान देता हूं जो इस बात पर निर्भर करता है कि आप आउटपुट के साथ क्या करना चाहते हैं।
1 - कॉल स्क्रिप्ट। आप अपने टर्मिनल में आउटपुट देखेंगे। आउटपुट एक संख्या है।
import subprocess
output = subprocess.call(['test.sh'])
2 - कॉल और डंप निष्पादन और स्ट्रिंग में त्रुटि। जब तक आप प्रिंट (स्टडआउट) नहीं करते, आपको अपने टर्मिनल में निष्पादन दिखाई नहीं देता है। शेल = पोपेन में तर्क के रूप में सच मेरे लिए काम नहीं करता है।
import subprocess
from subprocess import Popen, PIPE
session = subprocess.Popen(['test.sh'], stdout=PIPE, stderr=PIPE)
stdout, stderr = session.communicate()
if stderr:
raise Exception("Error "+str(stderr))
3 - कॉल स्क्रिप्ट और temp.txt की इको कमांड को temp_file में डंप करें
import subprocess
temp_file = open("temp.txt",'w')
subprocess.call([executable], stdout=temp_file)
with open("temp.txt",'r') as file:
output = file.read()
print(output)
डॉक्टर उपप्रकार पर एक नज़र रखना मत भूलना
सबप्रोसेस मॉड्यूल सबप्रोसेस को लॉन्च करने के लिए एक अच्छा मॉड्यूल है। आप इसे शेल कमांड को कॉल करने के लिए इसका उपयोग कर सकते हैं:
subprocess.call(["ls","-l"]);
#basic syntax
#subprocess.call(args, *)
आप इसके प्रलेखन को यहाँ देख सकते हैं ।
यदि आपके पास अपनी स्क्रिप्ट किसी .sh फ़ाइल या लंबी स्ट्रिंग में लिखी गई है, तो आप os.system मॉड्यूल का उपयोग कर सकते हैं। यह कॉल करने के लिए काफी सरल और आसान है:
import os
os.system("your command here")
# or
os.system('sh file.sh')
यह कमांड स्क्रिप्ट को एक बार चलाएगा, पूरा होने तक, और बाहर निकलने तक ब्लॉक करेगा।
मामले में स्क्रिप्ट में कई तर्क हैं
#!/usr/bin/python
import subprocess
output = subprocess.call(["./test.sh","xyz","1234"])
print output
आउटपुट स्टेटस कोड देगा। यदि स्क्रिप्ट सफलतापूर्वक चलती है तो यह 0 अन्यथा गैर-शून्य पूर्णांक देगी।
podname=xyz serial=1234
0
नीचे test.sh खोल लिपि है।
#!/bin/bash
podname=$1
serial=$2
echo "podname=$podname serial=$serial"
उपप्रकार अच्छा है लेकिन कुछ लोगों को स्क्रिप्टलाइन बेहतर लग सकती है। Scriptine में शेल.कॉल (args) , path.rename (new_name) और path.move (src, dst) जैसे तरीकों का अधिक उच्च स्तरीय सेट है । Scriptine उपप्रकार पर आधारित है और अन्य है।
पटकथा की दो कमियां:
मुझे पता है कि यह एक पुराना सवाल है, लेकिन मैं हाल ही में इस पर लड़खड़ा गया और इसने मुझे सबप्रोसेस एपीआई के बाद से गुमराह करते हुए समाप्त कर दिया, क्योंकि अजगर 3.5 से बदल गया था।
बाहरी स्क्रिप्ट को निष्पादित करने का नया तरीका run
फ़ंक्शन के साथ है , जो आर्ग्स द्वारा वर्णित कमांड चलाता है। कमांड को पूरा करने के लिए प्रतीक्षा करता है, फिर एक कंप्लीटप्रोप्रोसेस उदाहरण देता है।
import subprocess
subprocess.run(['./test.sh'])