मैं पायथन स्क्रिप्ट में कमांड लाइन कमांड कैसे चला सकता हूं?


16

मैं 2 अलग स्क्रिप्ट का उपयोग कर रहा हूं, Scale1.pyऔर Scale2.py। उन्हें चलाने के लिए मैं प्रवेश करता हूं sudo python Scale1.pyया sudo python Scale2.pyटर्मिनल कमांड लाइन से। मैं Scale2.pyस्क्रिप्ट में एक पंक्ति रखना चाहूंगा जिसमें अगर मैं एक बटन दबाता हूं, तो कार्यक्रम टूट जाता है और चलता है Scale1.py। कुछ इस तरह, जो काम नहीं करता है।

if GPIO.input(23) == False:
    break(sudo python Scale1.py)

जवाबों:


24

os.system("sudo python scale1.py")

पहले आपको ओएस मॉड्यूल आयात करने की आवश्यकता होगी

import os

मेरे पास परीक्षण करने के लिए मेरे साथ एक pi नहीं है, लेकिन यह इस प्रश्न के दूसरे उत्तर से आता है: /programming/89228/calling-an-external-command-in-python


यह वही है जो मैंने कोशिश की और यह काम किया, बहुत बहुत धन्यवाद हैरी! लेकिन मुझे पहले दोनों कार्यक्रमों को संयोजित करना पड़ा। अब os.system ("sudo python Scale3.py") केवल Scale3.py कार्यक्रम की शुरुआत में पुनः आरंभ होता है, जो ठीक है। मुझे लगता है कि Scale3.py आयात भी काम करेगा। मैंने सबप्रोसेस की कोशिश नहीं की, यह दिलचस्प लगता है और शायद कुछ ऐसा है जो मुझे सीखने की ज़रूरत है।
रिको

os.system()के पक्ष में subprocess
वंचित

12

सामान्य तौर पर, सबप्रोसेस मॉड्यूल का उपयोग करें

subprocess.call(["sudo","python","scale1.py"]) 

कमांड लाइन कॉल के लिए।

एक उपप्रकार कॉल के परिणाम को संसाधित करने वाला एक उदाहरण;

 result = subprocess.check_output(['sudo','service','mpd','restart'])

उपप्रक्रिया कई बड़े मॉड्यूल और काम करता है, की तरह बदल देता है os.system और os.spawn । यह तर्कों को साफ करने में एक अच्छा काम करता है, इसलिए यह आपको शेल इंजेक्शन से बचाता है ।

https://docs.python.org/2/library/subprocess.html

बेशक एक दूसरा अजगर स्क्रिप्ट चलाने के लिए सीएलआई कॉल की आवश्यकता नहीं है, आप उन आयात कर सकते हैं।


मैं यह जानने की कोशिश कर रहा हूं कि पायथन स्क्रिप्ट के भीतर से कमांड कैसे जारी करें ( यहां और यहां देखें ) और कुछ समस्याएं हैं। मुझे आश्चर्य है कि क्या subprocessमेरे मामले में भी बेहतर हो सकता है।
उहोह

6

आप सुदो का उपयोग कर सकते हैं जैसा कि सुझाव दिया गया है, लेकिन आपको सूडोर्स फ़ाइल में पहली स्क्रिप्ट चलाने वाले उपयोगकर्ता को जोड़ना होगा ।

पायथन लिपि को किसी अन्य पाइथन लिपि से चलाने का सबसे अच्छा तरीका इसे आयात करना है। आपको दूसरी स्क्रिप्ट में एक विधि में अपनी स्क्रिप्ट का तर्क रखना चाहिए:

# Scale2.py
डीईएफ रन ():
    पहले करो()
    do_second ()
    [...]

# कमांड लाइन से कॉल करने पर ही इसे चलाएं
अगर __name__ == '__main__':
    Daud()
# Scale1.py
आयात स्केल २

अगर (GPIO.input (23) == गलत):
    Scale2.run ()

2
+1, चूंकि अजगर इसके लिए सक्षम है, इसलिए यह cleanestउत्तर होगा।
लुवी

1
+1, यह वही तरीका है जो ओपी चाहता है और संभवतः स्वीकृत उत्तर होना चाहिए।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.