pythonw.exe या python.exe?


157

लंबी कहानी छोटी: pythonw.exeकुछ नहीं करती, कुछ भी python.exeस्वीकार नहीं करती (जो मुझे उपयोग करना चाहिए?)

test.py:

print "a"

CMD विंडो:

C:\path>pythonw.exe test.py
<BLANK LINE>
C:\path>

C:\path>python.exe test.py
  File "C:\path\test.py", line 7
    print "a"
            ^
SyntaxError: invalid syntax

C:\path>

कृपया बताएं कि मैं क्या गलत कर रहा हूं।


14
दुर्भाग्य से यह दो पहलुओं python बनाम pythonw (आम तौर पर अधिक दिलचस्प पहलू) और python2 से python3 में कुछ बुनियादी वाक्यविन्यास परिवर्तन को रोकता है। ओपी की कोई आलोचना जो पहले से नहीं जान सकता था, लेकिन फिर भी यह इस प्रश्न के मूल्य को अजगर डब्ल्यू के बारे में जाना जाता है
15:25 बजे mnagel

जवाबों:


170

यदि आप एक टर्मिनल विंडो नहीं चाहते हैं, जब आप अपना प्रोग्राम चलाते हैं, उपयोग करते हैं pythonw.exe;
अन्यथा, उपयोग करेंpython.exe

सिंटैक्स त्रुटि के बारे में: print अब 3.x में एक फ़ंक्शन है
इसके बजाय उपयोग करें:

print("a")

283

मौजूदा उत्तरों को संक्षेप और पूरक करने के लिए:

  • python.exeCLI- टाइप स्क्रिप्ट लॉन्च करने के लिए एक कंसोल (टर्मिनल) एप्लिकेशन है ।

    • जब तक किसी मौजूदा कंसोल विंडो से न चला जाए, python.exe एक नई कंसोल विंडो खोलता है
    • स्टैंडर्ड धाराओं sys.stdin , sys.stdoutऔर sys.stderrकर रहे हैं कंसोल विंडो से जुड़ा
    • जब एक या PowerShell कंसोल विंडो से लॉन्च किया जाता है, तो निष्पादन समकालिक होता है cmd.exe: नीचे eryksun की पहली टिप्पणी देखें।

      • यदि एक नई कंसोल विंडो बनाई गई थी, तो वह तब तक खुली रहती है जब तक स्क्रिप्ट समाप्त नहीं हो जाती।
      • जब किसी मौजूदा कंसोल विंडो से मंगवाया जाता है, तो स्क्रिप्ट समाप्त होने तक प्रॉम्प्ट को ब्लॉक कर दिया जाता है।
  • pythonw.exeGUI / no-UI-at-all स्क्रिप्ट लॉन्च करने के लिए एक GUI ऐप है ।

    • कोई कंसोल विंडो नहीं खोली गई है।
    • निष्पादन अतुल्यकालिक है :
      • जब एक कंसोल विंडो से मंगवाया जाता है, तो स्क्रिप्ट को केवल लॉन्च किया जाता है और तुरंत तुरंत वापस आ जाता है, चाहे स्क्रिप्ट अभी भी चल रही है या नहीं।
    • स्टैंडर्ड धाराओं sys.stdin , sys.stdoutऔर sys.stderrकर रहे हैं उपलब्ध नहीं
      • सावधानी : जब तक आप अतिरिक्त कदम नहीं उठाते , तब तक इसके संभावित रूप से अप्रत्याशित दुष्प्रभाव होते हैं :
        • अनचाही अपवाद स्क्रिप्ट को चुपचाप गर्भपात करने का कारण बनता है
        • पायथन 2.x में, बस उपयोग करने की कोशिश करने print()से ऐसा हो सकता है (3.x में, print()बस कोई प्रभाव नहीं है)।
        • अपनी स्क्रिप्ट के भीतर से इसे रोकने के लिए , और अधिक जानने के लिए, मेरा यह उत्तर देखें ।
        • तदर्थ , आप आउटपुट पुनर्निर्देशन का उपयोग कर सकते हैं : धन्यवाद, @ खंड।
          pythonw.exe yourScript.pyw 1>stdout.txt 2>stderr.txt
          (PowerShell से
          cmd /c pythonw.exe yourScript.pyw 1>stdout.txt 2>stderr.txt:) फ़ाइलों में stdout और stderr आउटपुट कैप्चर करने के लिए ।
          यदि आपको विश्वास है कि इसका उपयोग print()एकमात्र कारण है कि आपकी स्क्रिप्ट चुपचाप विफल हो जाती है pythonw.exe, और आप stdout आउटपुट में रुचि नहीं रखते हैं, तो टिप्पणियों से @ हैंडल की कमांड का उपयोग करें:
          pythonw.exe yourScript.pyw 1>NUL 2>&1
          कैविएट : यह आउटपुट रीडायरेक्शन तकनीक तब काम नहीं करती है जब *.pywस्क्रिप्ट को सीधे आमंत्रित किया जाता है ( स्क्रिप्ट फ़ाइल पथ को पास करने के विरोध में pythonw.exe)। देखें eryksun की दूसरी टिप्पणी और इसके अनुवर्ती नीचे।

आप यह नियंत्रित कर सकते हैं कि कौन सा निष्पादन डिफ़ॉल्ट रूप से आपकी स्क्रिप्ट चलाता है - जैसे कि एक्सप्लोरर से खोला जाने पर - सही फ़ाइल नाम एक्सटेंशन का चयन करके :

  • *.py फाइलें डिफ़ॉल्ट रूप से जुड़ी (मंगवाई गई) हैं python.exe
  • *.pyw फाइलें डिफ़ॉल्ट रूप से जुड़ी (मंगवाई गई) हैं pythonw.exe

1
पुनश्च: यह तब काम करता है जब मैं कहीं से डगमगाता हूं और डगमगाता हूं: > pythonw ls.pyw >nul 2>&1(भले ही कुछ भी न लिखा हो)।
संभालें

1
यह तुल्यकालिक और अतुल्यकालिक व्यवहार केवल कमांड का उपयोग किए बिना cmd.exe इंटरैक्टिव कमांड प्रॉम्प्ट से है start। यह वास्तव में यह PEBनिर्धारित करने के लिए बच्चे की प्रक्रिया का निरीक्षण करता है कि क्या यह एक सांत्वना प्रक्रिया है। कंसोल होस्ट प्रक्रिया (conhost.exe) इस बारे में परवाह नहीं करती है। यदि आप वर्तमान कंसोल में subprocess.Popenएक और python.exeउदाहरण संलग्न करने के लिए उपयोग करते हैं और उस waitपर नहीं चलते हैं , तो आपके पास कंसोल को एक साथ एक्सेस करने के लिए रेसिंग दोनों प्रक्रियाओं का भ्रामक गड़बड़ होगा।
इरीक सन

2
सिस्टम कॉल द्वारा उपयोगकर्ता-मोड प्रक्रिया बनाई जाती है NtCreateUserProcess। यदि लक्ष्य निष्पादन योग्य एक कंसोल प्रोग्राम है, तो सिस्टम बिना शर्त के माता-पिता के मानक हैंडल को विरासत में देता है। लेकिन एक गैर-सांत्वना कार्यक्रम के लिए यह स्पष्ट रूप से माता-पिता के अंतर्निहित संभाल के वारिस होने की आवश्यकता है। फ़ाइल एसोसिएशन के आधार पर एक फ़ाइल चलाने के लिए, cmd कॉल ShellExecuteEx, जो स्पष्ट रूप से इनहेरिट नहीं करता है जब यह कॉल करता है CreateProcess=> NtCreateUserProcess। नतीजतन, मानक I / O, रीडायरेक्टिंग मानक I / O कंसोल में काम करते हैं। कंसोल स्क्रिप्ट्स को शुरू करते हैं, लेकिन गैर-कंसोल .pyw स्क्रिप्ट्स को नहीं।
इरीक सन

2
Cmd शेल पहले के रूप में पारित के CreateProcessसाथ की कोशिश करता है । यह केवल तब विफल होता है जब विफल हो जाता है क्योंकि लक्ष्य एक पीई निष्पादन योग्य नहीं है (जैसे यह एक .py स्क्रिप्ट है) या उन्नयन की आवश्यकता है (उदाहरण के लिए osn.exe)। इसलिए जब आप सीधे दौड़ते हैं या , यह cmd , और , कौन सा cmd (वास्तव में CRT) इनहेरिट करेगा , जब मानक I / O को पाइप, फ़ाइल या डिवाइस पर रीडायरेक्ट किया जाता है, तो कॉल करने से पहले और बाद में संशोधित करता है। bInheritHandlesTRUEShellExecuteExCreateProcesspythonw.exepyw.exeStandardInputStandardOutputStandardErrorSetStdHandleCreateProcess
एरिक सन

2
ध्यान दें कि cmd STARTUPINFOपायथन के विपरीत हैंडल (hStdInput, hStdOutput, hStdErr) का उपयोग नहीं करता है subprocess.Popen। यह इसके साथ दूर हो सकता है क्योंकि यह एक एकल-थ्रेडेड प्रोग्राम है। यह केवल इस डिज़ाइन के कारण है कि पुनर्निर्देशन सभी के साथ काम करता है ShellExecuteEx(सिर्फ कंसोल प्रोग्राम के लिए, जैसा कि उल्लेख किया गया है) क्योंकि GUI शेल API में मानक I / O के लिए कोई समर्थन नहीं है।
एरिक सन

19

यहां देखें: http://docs.python.org/use/windows.html

pythonw.exe "यह स्टार्टअप पर टर्मिनल विंडो को दबाता है।"


8
pythonw.exeइसके साइड इफेक्ट्स हैं जो आपके प्रोग्राम को विफल कर सकते हैं यदि यह stdout / stderr स्ट्रीम को लिखता है - देखें Bugs.python.org/issue706263
anatoly techtonik

16

यदि आप किसी अन्य प्रक्रिया से अजगर स्क्रिप्ट को कॉल करने जा रहे हैं (कहते हैं, कमांड लाइन से), का उपयोग करें pythonw.exe। अन्यथा, आपका उपयोगकर्ता लगातार cmdअजगर की प्रक्रिया को शुरू करने वाली एक खिड़की को देखेगा । यह अभी भी आपकी स्क्रिप्ट को समान रूप से चलाएगा, लेकिन यह उपयोगकर्ता के अनुभव पर ध्यान नहीं देगा।

एक उदाहरण एक ईमेल भेज रहा हो सकता है; python.exeएक CLI विंडो को पॉप अप करेगा, ईमेल भेजेगा, फिर विंडो को बंद करेगा। यह एक त्वरित फ़्लैश के रूप में दिखाई देगा, और इसे कुछ हद तक कष्टप्रद माना जा सकता है। pythonw.exeइससे बचा जाता है, लेकिन फिर भी ईमेल भेजता है।


6
यह सच है, लेकिन "कमांड लाइन से," फिर से कहें: यदि आप पहले से ही एक कंसोल (टर्मिनल) विंडो में हैं, तो एक दूसरे python.exeको नहीं खोलेंगे।
mklement0

2

मैं थोड़ी देर के लिए इसे काम करने के लिए संघर्ष कर रहा था। एक बार जब आप .pyw के लिए एक्सटेंशन को बदलते हैं, तो सुनिश्चित करें कि आप फ़ाइल के गुणों को खोलते हैं और pythonw.exe के लिए "खुले" पथ को निर्देशित करते हैं।


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