2012-12-29 16 views
33

मुझे subprocess.check_output() के बारे में प्रलेखन मिला है लेकिन मुझे तर्कों के साथ कोई नहीं मिल रहा है और दस्तावेज़ीकरण गहराई से नहीं है। मैं अजगर 3 का उपयोग कर रहा है (लेकिन अजगर 3 के माध्यम से एक अजगर 2 फ़ाइल को चलाने के कोशिश कर रहा हूँ)आप Python में subprocess.check_output() का उपयोग कैसे करते हैं?

मैं इस आदेश को चलाने के लिए कोशिश कर रहा हूँ: python py2.py -i test.txt

मैं argparse के लिए एक स्थितीय तर्क है, test.txt है क्या मैं है, py2.py

चलाने के लिए फ़ाइल मैं सहित (गैर काम कर रहे) रूपों का एक बहुत कोशिश की है है: py2output = subprocess.check_output([str('python py2.py '),'-i', 'test.txt'])

py2output = subprocess.check_output([str('python'),'py2.py','-i', test.txt'])

+1

चलाने के लिए क्या हुआ जब वे काम नहीं करते थे? – khagler

+1

पायथन 3 फ़ाइल के माध्यम से पाइथन 2 फ़ाइल चलाने की कोशिश कर रहा है? नहीं, होने वाला नहीं है। पाइथन 3 जानबूझकर पीछे नहीं है- पायथन 2 के साथ संगत। आपको अपनी फाइल को पायथन 3 में काम करने के लिए * स्टार्टर्स * के लिए '2to3' चलाने की आवश्यकता होगी। – Makoto

+1

@Makoto: वह पाइथन 2 दुभाषिया को एक के भीतर से चलाने की कोशिश कर रहा है पायथन 3 स्क्रिप्ट, जो पूरी तरह से उचित है। (और अपने पिछले प्रश्न से, यह जानना होता है कि वह विशेष रूप से उन समस्याओं के लिए कामकाज के रूप में कर रहा है, जिनके बारे में आप सोच रहे हैं, लेकिन यह यहां प्रासंगिक नहीं है।) – abarnert

उत्तर

45

सही जवाब है:

py2output = subprocess.check_output(['python','py2.py','-i', 'test.txt']) 

प्रदर्शित करने के लिए, यहाँ मेरे दो कार्यक्रम हैं:

py2.py:

import sys 
print sys.argv 

py3.py:

import subprocess 
py2output = subprocess.check_output(['python', 'py2.py', '-i', 'test.txt']) 
print('py2 said:', py2output) 

यह चल रहा है :

$ python3 py3.py 
py2 said: b"['py2.py', '-i', 'test.txt']\n" 

गया है कि आपकी संस्करणों में से प्रत्येक के साथ कुछ गलत है:

py2output = subprocess.check_output([str('python py2.py '),'-i', 'test.txt']) 

पहले, str('python py2.py') वास्तव में एक str लेने, और str बुला यह एक str कन्वर्ट करने के लिए -तुम 'python py2.py' रूप में एक ही बात है। यह कोड को किसी भी लाभ को जोड़ने के बिना, लंबे, और यहां तक ​​कि धीमे पढ़ने के लिए कठिन बनाता है।

अधिक गंभीरता से, python py2.py एक भी तर्क नहीं हो सकता है, जब तक कि आप वास्तव में नामित प्रोग्राम चलाने की कोशिश नहीं कर रहे हैं, /usr/bin/python\ py2.py। जो आप नहीं हैं; आप पहले तर्क py2.py के साथ, /usr/bin/python चलाने के लिए कह रहे हैं। इसलिए, आपको सूची में उन्हें अलग-अलग तत्व बनाने की आवश्यकता है।

आपका दूसरा संस्करण उसमें हल करता है, लेकिन test.txt' से पहले आप ' खो रहे हैं। यह आपको SyntaxError देना चाहिए, शायद EOL while scanning string literal कह रहा है।

इस बीच, मुझे यकीन नहीं है कि आपको दस्तावेज़ कैसे मिला लेकिन तर्कों के साथ कोई उदाहरण नहीं मिला। बहुत पहले उदाहरण है:

>>> subprocess.check_output(["echo", "Hello World!"]) 
b'Hello World!\n' 

एक अतिरिक्त तर्क, "Hello World!" साथ "echo" आदेश कहता है कि।

इसके अलावा:

मैं argparse, परीक्षण के लिए एक स्थितीय तर्क है।txt क्या मैं

मैं यकीन है कि -iनहीं एक स्थितीय तर्क है, लेकिन एक वैकल्पिक तर्क है कर रहा हूँ है। अन्यथा, वाक्य के दूसरे भाग में कोई मतलब नहीं है।

+0

अब मैंने Argparse में 2 तर्कों के साथ प्रयास किया। मैंने इस कमांड को सबप्रोसेस में डालने का प्रयास किया: 'python py2.py -i test.txt -l ong' मैंने आपके उत्तर के आधार पर इस सबप्रोसेस को आजमाया: 'py2output = subprocess.check_output ([" पायथन "," py2.py ", "-i", "test.txt", "- l", "ong"]) 'लेकिन यह काम नहीं करता है। –

+1

@ user1925847: "यह काम नहीं करता" से आपका क्या मतलब है? यह एक सहायक टिप्पणी नहीं है। यदि आप इसे सही करते हैं, तो यह काम करता है-जैसा कि मेरा जवाब दर्शाता है। तो जाहिर है आपने कुछ गलत किया है। लेकिन अनुमान लगाना असंभव है। जैसा कि मैंने मुख्य प्रश्न पर एक टिप्पणी में कहा था: हमें अपनी स्क्रिप्ट दिखाएं, और हमें बताएं कि अपेक्षित और वास्तविक आउटपुट क्या है, या अनुमान लगाने की कोई उम्मीद नहीं है कि आप क्या कर रहे हैं। – abarnert

+1

और CalledProcessError ** और ** OSError अपवादों को पकड़ना न भूलें। –

2

@abarnert ने उल्लेख किया एक के लिए पर जोड़ने

एक बेहतर एक अपवाद

import subprocess 
try: 
    py2output = subprocess.check_output(['python', 'py2.py', '-i', 'test.txt'],stderr= subprocess.STDOUT) 
    #print('py2 said:', py2output) 
    print "here" 
except subprocess.CalledProcessError as e: 
    print "Calledprocerr" 

को पकड़ने के लिए है इस stderr = subprocess.STDOUT सुनिश्चित करने के लिए आप filenotfound त्रुटि मिलती है न है stderr- जिसे आमतौर पर filenotfoundexception में पकड़ा नहीं जा सकता है, अन्यथा आप

python: can't open file 'py2.py': [Errno 2] No such file or directory 

वास्तव में समाप्त हो जाएगा इसका बेहतर समाधान यह जांचना हो सकता है कि फ़ाइल/स्क्रिप्ट मौजूद हैं और फिर फ़ाइल/स्क्रिप्ट

संबंधित मुद्दे