अजगर कोड से शेल स्क्रिप्ट कैसे कॉल करें?


जवाबों:


252

उपप्रक्रिया मॉड्यूल तुम बाहर में मदद मिलेगी।

स्पष्ट रूप से तुच्छ उदाहरण:

>>> import subprocess
>>> subprocess.call(['./test.sh']) # Thanks @Jim Dennis for suggesting the []
0 
>>> 

जहां test.shएक सरल शेल स्क्रिप्ट है और 0इस रन के लिए उसका रिटर्न वैल्यू है।


11
नोट: यह सबप्रोसेस.कॉल पास करना बेहतर है () एक स्ट्रिंग के बजाय एक सूची (उदाहरण और कारणों के लिए नीचे Hugo24 को कमांड देखें)।
जिम डेनिस

1
ट्यूटोरियल का लिंक टूट गया है।
क्षितिज सरावगी

6
यह देता है: OSError: [Errno 13] अनुमति से इनकार किया। मेरी स्क्रिप्ट को सुडो के साथ चलने की आवश्यकता नहीं है। @Manoj गोविंदन
alper

6
तर्कों के साथ: subprocess.call (['./ test.sh', 'param1', 'param2'])
हेनरी

2
@alper उस फ़ोल्डर पर जाएं जहां आपने स्क्रिप्ट रखी है और कमांड चलाएं chmod +x script.sh,। नोट: script.sh आपकी स्क्रिप्ट के लिए एक प्लेसहोल्डर है, इसे उसी के अनुसार बदलें।
टॉम जे मुथिरन्थी

105

उपयोग करने के कुछ तरीके os.popen()(पदावनत) या पूरे subprocessमॉड्यूल हैं, लेकिन यह दृष्टिकोण है

import os
os.system(command)

सबसे आसान में से एक है।


1
यह सबसे उत्कट उत्तर क्यों नहीं है? एक मॉड्यूल बेहतर समाधान आयात करने के लिए नहीं है? यहाँ कुछ कमी होनी चाहिए?
बोल्डर_रुबी

6
साथ subprocessआप इनपुट / आउटपुट / त्रुटि पाइप प्रबंधन कर सकते हैं। जब आपके पास कई तर्क होते हैं तो यह भी बेहतर है - os.command()आपके पास विशेष वर्णों से बचने के साथ पूरी कमांड लाइन बनानी होगी, जिसमें subprocessतर्कों की सरल सूची होगी। लेकिन सरल कार्यों के os.command() लिए बस पर्याप्त हो सकता है।
माइकल निकल्स

1
उस लिंक से उद्धृत करने के लिए:The subprocess module provides more powerful facilities for spawning new processes and retrieving their results; *using that module is preferable to using this function.*
मैक्सिमिलियन

42

यदि आप अपनी शेल स्क्रिप्ट में कुछ पैरामीटर पास करना चाहते हैं, तो आप विधि 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

यह सुरुचिपूर्ण है।
22


15

उपप्रोसेस मॉड्यूल का उपयोग करें जैसा कि ऊपर बताया गया है।

मैं इसे इस तरह से उपयोग करता हूं:

subprocess.call(["notepad"])

13
नोट: किसी सूची के साथ उपप्रकार को सुरक्षित रखना क्योंकि यह पार्सिंग / व्याख्या के लिए एक शेल के माध्यम से (संभावित असमान) स्ट्रिंग को पारित करने की आवश्यकता नहीं है। सूची में पहला आइटम निष्पादन योग्य होगा और अन्य सभी आइटम तर्क के रूप में पारित किए जाएंगे।
जिम डेनिस

13

मैं अजगर 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)

डॉक्टर उपप्रकार पर एक नज़र रखना मत भूलना


1
नोट: stdout = PIPE या stderr = PIPE का उपयोग न करें subprocess.call। बाल प्रक्रिया अवरुद्ध हो जाएगी यदि यह ओएस पाइप बफर को भरने के लिए पाइप में पर्याप्त आउटपुट उत्पन्न करता है क्योंकि पाइप से पढ़ा नहीं जा रहा है।

4

सबप्रोसेस मॉड्यूल सबप्रोसेस को लॉन्च करने के लिए एक अच्छा मॉड्यूल है। आप इसे शेल कमांड को कॉल करने के लिए इसका उपयोग कर सकते हैं:

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')

यह कमांड स्क्रिप्ट को एक बार चलाएगा, पूरा होने तक, और बाहर निकलने तक ब्लॉक करेगा।


क्या आपको एसईएस भी आयात नहीं करना है?
स्कॉट्टीब्लाड्स

नहीं, तुम नहीं; पायथन खोल खोलने की कोशिश करें और इस स्निपेट को
डेसकार्टेस

4

मामले में स्क्रिप्ट में कई तर्क हैं

#!/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"

2

उपप्रकार अच्छा है लेकिन कुछ लोगों को स्क्रिप्टलाइन बेहतर लग सकती है। Scriptine में शेल.कॉल (args) , path.rename (new_name) और path.move (src, dst) जैसे तरीकों का अधिक उच्च स्तरीय सेट है । Scriptine उपप्रकार पर आधारित है और अन्य है।

पटकथा की दो कमियां:

  • वर्तमान प्रलेखन स्तर पर्याप्त होने के बावजूद अधिक व्यापक होगा।
  • उपप्रकार के विपरीत, स्क्रिप्टलाइन पैकेज वर्तमान में डिफ़ॉल्ट रूप से स्थापित नहीं है।

2

मुझे पता है कि यह एक पुराना सवाल है, लेकिन मैं हाल ही में इस पर लड़खड़ा गया और इसने मुझे सबप्रोसेस एपीआई के बाद से गुमराह करते हुए समाप्त कर दिया, क्योंकि अजगर 3.5 से बदल गया था।

बाहरी स्क्रिप्ट को निष्पादित करने का नया तरीका runफ़ंक्शन के साथ है , जो आर्ग्स द्वारा वर्णित कमांड चलाता है। कमांड को पूरा करने के लिए प्रतीक्षा करता है, फिर एक कंप्लीटप्रोप्रोसेस उदाहरण देता है।

import subprocess

subprocess.run(['./test.sh'])

1

यदि आपकी शेल स्क्रिप्ट फ़ाइल में अनुमतियाँ निष्पादित नहीं हैं, तो निम्न तरीके से करें।

import subprocess
subprocess.run(['/bin/bash', './test.sh'])

-9

कृपया निम्नलिखित कोड आज़माएं:

Import Execute 

Execute("zbx_control.sh")
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.