अजगर के भीतर से बैश स्क्रिप्ट चल रही है


110

मुझे निम्नलिखित कोड में कोई समस्या है:

callBash.py:

import subprocess
print "start"
subprocess.call("sleep.sh")
print "end"

sleep.sh:

sleep 10

मैं चाहता हूं कि 10 के बाद "अंत" छपा हो। (मुझे पता है कि यह एक गूंगा उदाहरण है, मैं बस अजगर के भीतर सो सकता था, लेकिन यह साधारण नींद थी। यह फ़ाइल एक परीक्षण के रूप में थी)


मैंने इसे "$! बिन / बैश, स्लीप 10?" के साथ भी आज़माया
user1638145

यह स्पष्ट नहीं है कि यह खोजकर्ता किस समस्या के बारे में पूछने की कोशिश कर रहा है, लेकिन सवाल शायद बना रहना चाहिए क्योंकि इसने उत्तर के रूप में अधिक या कम अच्छे अनुमानों के ऐतिहासिक हड़पने बैग को अर्जित किया है। संभवतः आपकी विशिष्ट त्रुटि की भी खोज करें, और / या संबंधित प्रश्न पढ़ें जैसे stackoverflow.com/questions/4256107/…
tripleee

जवाबों:


93

Sleep.sh को निष्पादन योग्य बनाना और shell=Trueपैरामीटर सूची में जोड़ना (जैसा कि पिछले उत्तरों में सुझाया गया है) ठीक काम करता है। खोज पथ के आधार पर, आपको ./कुछ अन्य उपयुक्त पथ जोड़ने या जोड़ने की आवश्यकता हो सकती है। (यानी, में परिवर्तन "sleep.sh"करें "./sleep.sh")

shell=Trueपैरामीटर की जरूरत नहीं है, तो पार्टी स्क्रिप्ट की पहली पंक्ति एक खोल करने के लिए एक रास्ता है (लिनक्स की तरह एक POSIX प्रणाली के तहत); उदाहरण के लिए, #!/bin/bash


50

यदि sleep.shशेबबैंग है #!/bin/shऔर उसके पास उपयुक्त फ़ाइल अनुमतियां हैं - chmod u+rx sleep.shतो सुनिश्चित करने के लिए चलाएं और यह $PATHतब है जब आपका कोड काम करना चाहिए:

import subprocess

rc = subprocess.call("sleep.sh")

यदि स्क्रिप्ट PATH में नहीं है, तो इसे पूरा पथ निर्दिष्ट करें, उदाहरण के लिए, यदि यह वर्तमान कार्यशील निर्देशिका में है:

from subprocess import call

rc = call("./sleep.sh")

यदि स्क्रिप्ट में कोई शेबंग नहीं है, तो आपको निर्दिष्ट करने की आवश्यकता है shell=True:

rc = call("./sleep.sh", shell=True)

यदि स्क्रिप्ट की कोई निष्पादन योग्य अनुमति नहीं है और आप उसे बदल नहीं सकते हैं, os.chmod('sleep.sh', 0o755)तो चलकर आप स्क्रिप्ट को टेक्स्ट फ़ाइल के रूप में पढ़ सकते हैं और subprocessइसके बजाय स्ट्रिंग को मॉड्यूल में पास कर सकते हैं :

with open('sleep.sh', 'rb') as file:
    script = file.read()
rc = call(script, shell=True)

34

दरअसल, आपको सिर्फ shell=Trueतर्क जोड़ना होगा :

subprocess.call("sleep.sh", shell=True)

मगर सावधान -

चेतावनी शेल के साथ सिस्टम शेल को शामिल करना = यदि अविश्वासित इनपुट के साथ मिलाया जाए तो यह एक सुरक्षा खतरा हो सकता है। विवरण के लिए अक्सर उपयोग किए गए तर्क के तहत चेतावनी देखें।

स्रोत


1
अगर यह काम नहीं करेगा sleep.shमें नहीं है PATH। और अगर यह है रास्ते में और यह सही मामला है तो आप की जरूरत नहीं है shell=Trueमेरा जवाब
jfs

18

अगर कोई तर्कों के साथ स्क्रिप्ट बुलाने की तलाश में है

import subprocess

val = subprocess.check_call("./script.sh '%s'" % arg, shell=True)

गुजरने से पहले स्ट्रिंग को आर्ग में बदलना याद रखें, str (arg) का उपयोग करके।

यह वांछित के रूप में कई तर्कों को पारित करने के लिए इस्तेमाल किया जा सकता है:

subprocess.check_call("./script.ksh %s %s %s" % (arg1, str(arg2), arg3), shell=True)

10

सुनिश्चित करें कि sleep.shनिष्पादन की अनुमति है, और इसे इसके साथ चलाएं shell=True:

#!/usr/bin/python

import subprocess
print "start"
subprocess.call("./sleep.sh", shell=True)
print "end"

तो यह शेल था = सच मैं याद किया। क्या आप बता सकते हैं, क्यों # स्के्रप्ट की पहली पंक्ति में # बिन / बैश लगाना पर्याप्त नहीं है?
user1638145

3
इसमें त्रुटि #!bin/bashगुम है /#!/bin/bashमैं एक उत्तर में नोट करता हूं।
जेम्स वाल्डबी - jwpat7

10

अगर चामोद काम नहीं कर रहा है तो आप भी कोशिश करें

import os
os.system('sh script.sh')
#you can also use bash instead of sh

मेरे द्वारा परीक्षण धन्यवाद


os.systemप्रलेखन विशेष रूप से करने के पक्ष में यह बचने की सिफारिश subprocess(इन दिनों, subprocess.run())। यदि आप subprocessकाम नहीं कर सकते हैं, तो संभावना है कि आपको os.system()भी परेशानी होगी ।
ट्रिपल जू

3

एक उत्तर जोड़ना क्योंकि मुझे यह पूछने के बाद निर्देशित किया गया था कि अजगर से बैश स्क्रिप्ट कैसे चलाना है। OSError: [Errno 2] file not foundयदि आपकी स्क्रिप्ट मापदंडों में लगती है तो आपको एक त्रुटि मिलती है । उदाहरण के लिए कहते हैं कि आपकी स्क्रिप्ट नींद के समय पैरामीटर में थी: subprocess.call("sleep.sh 10")काम नहीं करेगा, आपको इसे एक सरणी के रूप में पास करना होगा:subprocess.call(["sleep.sh", 10])


आपको वास्तविक अर्थshell=True को समझना होगा लेकिन हाँ, आमतौर पर इससे बचना आपका सबसे अच्छा खेल है।
ट्रिपल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.