2009-06-19 7 views
28

मैं पृष्ठभूमि में एक प्रक्रिया खोलना चाहता हूं और इसके साथ बातचीत करना चाहता हूं, लेकिन यह प्रक्रिया लिनक्स और विंडोज दोनों में अदृश्य होनी चाहिए। विंडोज में आप, STARTUPINFO के साथ कुछ सामान करना है, जबकि इस लिनक्स में मान्य नहीं है:छिपी हुई खिड़की के साथ क्रॉस-प्लेटफॉर्म सबप्रोसेस

ValueError: startupinfo is only supported on Windows platforms

वहाँ प्रत्येक ओएस के लिए एक अलग popen आदेश बनाने की तुलना में एक सरल तरीका है?

if os.name == 'nt': 
    startupinfo = subprocess.STARTUPINFO() 
    startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW 
    proc = subprocess.Popen(command, startupinfo=startupinfo) 
if os.name == 'posix': 
    proc = subprocess.Popen(command)  

उत्तर

31

आप एक पंक्ति :)

startupinfo = None 
if os.name == 'nt': 
    startupinfo = subprocess.STARTUPINFO() 
    startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW 
proc = subprocess.Popen(command, startupinfo=startupinfo) 
+0

आह। मैंने startupinfo = '' की कोशिश की थी और यह काम नहीं किया। यही वह जवाब है जिसे मैं ढूंढ रहा था। – endolith

+1

मैंने उपरोक्त कोड के माध्यम से यह देखने के लिए देखा कि वे उस त्रुटि संदेश को कैसे उत्पन्न करते हैं और वे जांचते हैं कि स्टार्टअपइन्फो कोई नहीं है, जैसा कि पाइथन –

+3

में होना चाहिए यदि आप 'STARTF_SHOWWINDOW' सेट करते हैं, तो आप' wShowWindow 'सदस्य को भी प्रारंभ करना चाहते हैं 'SW_ *' स्थिरांक में से एक को 'startupinfo''। यह विधि उस प्रोग्राम पर निर्भर करती है जिसे आप वास्तव में 'wShowWindow' ध्वज पर अभिनय करते हैं; ऐसा करने की आवश्यकता नहीं है। –

3

मुझे यकीन नहीं है कि आप जो भी किया है उससे कहीं अधिक सरल हो सकते हैं। आप कोड की 5 लाइनों को अनुकूलित करने के बारे में बात कर रहे हैं। पैसे के लिए मैं बस अपने प्रोजेक्ट के साथ आगे बढ़ूंगा और इसे क्रॉस-प्लेटफार्म विकास के अधिग्रहण के रूप में स्वीकार करूंगा। यदि आप इसे बहुत कुछ करते हैं तो तर्क को समाहित करने और आयात करने के लिए एक विशेष श्रेणी या फ़ंक्शन बनाएं।

1

आप में अपने कोड बदल सकते हैं:

params = dict() 

if os.name == 'nt': 
    startupinfo = subprocess.STARTUPINFO() 
    startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW 
    params['startupinfo'] = startupinfo 

proc = subprocess.Popen(command, **params) 

लेकिन वह ज्यादा बेहतर नहीं है।

+2

सभी प्रणालियों के रूप में पैरा बनाने की कोई ज़रूरत नहीं है Popen param startupinfo स्वीकार करता है लेकिन पॉज़िक्स पर यह कोई नहीं होना चाहिए –

12

बस एक नोट को कम कर सकते हैं: के लिए अजगर 2.7 मैं subprocess._subprocess.STARTF_USESHOWWINDOW बजाय subprocess.STARTF_USESHOWWINDOW उपयोग करना होगा।

+1

धन्यवाद, यह वास्तव में मुझे आवश्यक टिप था। –

+0

संबंधित पायथन मुद्दे 9 861: [सबप्रोसेस मॉड्यूल ने उजागर विशेषताओं को बदल दिया] (http://bugs.python.org/issue9861) –

+1

पायथन 2.7 का संस्करण क्या था? पाइथन 2.7.2 के बाद https://code.google.com/p/googleappengine/issues/detail?id=10363#c2 * 'subprocess.STARTF_USESHOWWINDOW' के अनुसार जोड़ा गया है। * –

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