2011-05-22 10 views
9

printbob.py:अजगर स्क्रिप्ट के भीतर से अजगर स्क्रिप्ट का आउटपुट प्राप्त

import sys 
for arg in sys.argv: 
    print arg 

getbob.py

import subprocess 
#printbob.py will always be in root of getbob.py 
#a sample of sending commands to printbob.py is: 
#printboby.py arg1 arg2 arg3 (commands are seperated by spaces) 

print subprocess.Popen(['printbob.py', 'arg1 arg2 arg3 arg4']).wait() 

x = raw_input('done') 

मैं:

File "C:\Python27\lib\subprocess.py", line 672, in __init__ 
    errread, errwrite) 
    File "C:\Python27\lib\subprocess.py", line 882, in _execute_child 
    startupinfo) 
WindowsError: [Error 193] %1 is not a valid Win32 application 

क्या मैं गलत यहाँ कर रहा हूँ? मैं सिर्फ एक और पायथन लिपि के अंदर एक और पायथन लिपि का आउटपुट प्राप्त करना चाहता हूं। क्या मुझे cmd.exe को कॉल करने की आवश्यकता है या क्या मैं सिर्फ printbob.py चला सकता हूं और इसे कमांड भेज सकता हूं?

उत्तर

8
proc = subprocess.Popen(['python', 'printbob.py', 'arg1 arg2 arg3 arg4'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 
print proc.communicate()[0] 

हालांकि ऐसा करने का एक बेहतर तरीका होना चाहिए, क्योंकि स्क्रिप्ट पाइथन में भी है। आप जो कर रहे हैं उससे लीवरेज करने का कोई तरीका ढूंढना बेहतर है।

+1

Traceback (सबसे हाल कॉल पिछले) दे: subprocess.STDIN AttributeError में फ़ाइल "", लाइन 1,: 'मॉड्यूल' ऑब्जेक्ट में कोई विशेषता नहीं है 'STDIN' – MistahX

+1

मीट STDOUT - निश्चित। – rfw

+0

मुझे अलग-अलग कॉमन सेपरेटेड स्ट्रिंग्स जैसे '[' पायथन ',' printbob.py ',' arg1 ',' arg2 ']' – Quinma

2

यह गलत दृष्टिकोण है।

आपको printbob.py रिफैक्टर करना चाहिए ताकि इसे अन्य पायथन मॉड्यूल द्वारा आयात किया जा सके। इस संस्करण में आयात किया जा सकता है और कहा जाता है कमांड लाइन से:

python printbob.py one two three four five 
printbob.py 
one 
two 
three 
four 
five 

अब हम यह getbob.py में आयात कर सकते हैं:

#!/usr/bin/env python 

import printbob 

printbob.main('arg1 arg2 arg3 arg4'.split(' ')) 

#!/usr/bin/env python 

import sys 

def main(args): 
    for arg in args: 
     print(arg) 

if __name__ == '__main__': 
    main(sys.argv) 

यहाँ यह कमांड लाइन से कहा जाता है

यहां यह चल रहा है:

python getbob.py 
arg1 
arg2 
arg3 
arg4 
+0

उत्तर के लिए धन्यवाद, लेकिन मैं चलाने के लिए एक रास्ता तलाश रहा था, पायथन कोड एक ही उदाहरण में नहीं है ... कुछ थ्रेड अजीब व्यवहार के कारण, लेकिन हाँ आपकी स्क्रिप्ट आयात करना आम तौर पर किसी अन्य स्क्रिप्ट में आपके कोड तक पहुंचने का सबसे अच्छा तरीका है। – MistahX

+1

@ मिस्टाएक्स: आपका अजीब धागा व्यवहार जो आपको लगता है कि दुभाषिया का एक नया उदाहरण दिलचस्प लगता है। इससे निपटने का एक बेहतर तरीका हो सकता है। लेकिन यह एक बिल्कुल नया सवाल है! – Johnsyweb

0

The shell argument (which defaults to False) specifies whether to use the shell as the program to execute. If shell is True, it is recommended to pass args as a string rather than as a sequence

बस एक स्ट्रिंग में सभी तर्कों लपेट और shell=True

proc = subprocess.Popen("python myScript.py --alpha=arg1 -b arg2 arg3" ,stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True) 
print proc.communicate()[0] 
संबंधित मुद्दे