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으로의 기본적인 구문 변경이라는 두 가지 측면을 혼합합니다. 사전에 알고 있지만, 그럼에도 불구하고이 같은이 질문의 값 taints 수없는 OP 전혀 비판하지 파이썬에 대한 이동 -에 자원 w를 .
mnagel

답변:


170

프로그램을 실행할 때 터미널 창이 나타나지 않게하려면 pythonw.exe;
그렇지 않으면python.exe

구문 오류와 관련하여 : print 이제 3.x의 함수
이므로 대신 사용하십시오.

print("a")

283

기존 답변을 요약하고 보완하려면 :

  • python.exeCLI 유형 스크립트를 실행하기위한 콘솔 (터미널) 애플리케이션 입니다 .

    • 기존 콘솔 창에서 실행하지 않는 python.exe 한 새 콘솔 창을 엽니 다 .
    • 표준 스트림 sys.stdin , sys.stdoutsys.stderr되는 콘솔 창에 연결 .
    • 실행은 동기 A로부터 시작 할 때 cmd.exe: 또는 PowerShell 콘솔 창 참조 eryksun '아래 첫번째 코멘트를에요.

      • 새 콘솔 창이 작성된 경우 스크립트가 종료 될 때까지 열린 상태로 유지됩니다.
      • 기존 콘솔 창에서 호출되면 스크립트가 종료 될 때까지 프롬프트가 차단됩니다.
  • pythonw.exeGUI / no-UI-at-all 스크립트를 실행하기위한 GUI 앱 입니다 .

    • 콘솔 창이 열리지 않습니다.
    • 실행은 비동기 적입니다 .
      • 콘솔 창에서 호출하면 스크립트가 시작 되고 스크립트 실행 여부와 상관없이 프롬프트가 즉시 반환됩니다.
    • 표준 스트림 sys.stdin , sys.stdout그리고 sys.stderr있습니다 사용할 수 없습니다 .
      • 주의 : 당신이 추가 단계를 수행하지 않는 한 ,이가 잠재적으로 예상치 못한 부작용 :
        • 처리되지 않은 예외로 인해 스크립트가 자동 으로 중단 됩니다.
        • Python 2.x에서는 단순히 사용하려고 print()하면이 문제가 발생할 수 있습니다 (3.x에서는 print()효과가 없습니다).
        • 스크립트 내에서 이를 방지하고 자세한 내용을 보려면 내 대답 을 참조하십시오 .
        • Ad , 당신은 출력 리디렉션을 사용할 수 있습니다 : Thanks, @handle.
          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 출력을 캡처 합니다 . 스크립트 사용이 자동으로 실패하는 유일한 이유
          라고 확신하고 stdout 출력에 관심이없는 경우 주석에서 @handle 의 명령을 사용하십시오. 경고 :이 출력 리디렉션 기술은 스크립트를 직접 호출 할 때 작동 하지 않습니다 ( 스크립트 파일 경로를 ) 에 전달하는 것과 반대 입니다. 아래의 eryksun 의 2 번째 코멘트 및 후속 조치를 참조하십시오.print()pythonw.exe
          pythonw.exe yourScript.pyw 1>NUL 2>&1
          *.pywpythonw.exe

올바른 파일 이름 확장자를 선택하여 탐색기에서 열 때와 같이 기본적으로 스크립트를 실행하는 실행 파일을 제어 할 수 있습니다 .

  • *.py 파일은 기본적으로 python.exe
  • *.pyw 파일은 기본적으로 pythonw.exe

1
추신 : 그것은 stdout과 stderr를 어딘가에 파이프 할 때 작동합니다 > pythonw ls.pyw >nul 2>&1(아무것도 쓰지 않아도).
처리

1
이 동기 및 비동기 동작은 명령을 사용하지 않고 cmd.exe 대화식 명령 프롬프트에서 발생합니다 start. 실제로 PEB자식 프로세스를 검사하여 콘솔 프로세스인지 확인합니다. 콘솔 호스트 프로세스 (conhost.exe)는 이에 대해 신경 쓰지 않습니다. 당신이 사용하는 경우 subprocess.Popen다른 연결하는 python.exe현재 콘솔에 인스턴스를하고하지 않습니다 wait그 위에, 당신은 동시에 콘솔에 액세스 경주 두 프로세스의 혼란 혼란이있을 것이다.
Eryk Sun

2
시스템 호출에 의해 사용자 모드 프로세스가 작성됩니다 NtCreateUserProcess. 대상 실행 파일이 콘솔 프로그램 인 경우 시스템은 부모의 표준 핸들을 무조건 상속합니다. 그러나 콘솔이 아닌 프로그램의 경우 부모의 상속 가능한 핸들을 상속하도록 명시 적으로 지시해야합니다. 파일 연결을 기반으로 파일을 실행하기 위해 cmd calls ShellExecuteExCreateProcess=>를 호출 할 때 핸들을 명시 적으로 상속하지 않습니다 NtCreateUserProcess. 결과적으로 콘솔 .py 스크립트를 시작할 때 cmd에서 표준 I / O 리디렉션이 작동하지만 콘솔이 아닌 .pyw 스크립트는 작동하지 않습니다.
Eryk Sun

2
cmd 쉘은 먼저 CreateProcessbInheritHandles전달을 시도합니다 TRUE. 대상이 PE 실행 파일이 아니거나 (예 : .py 스크립트) 고도가 필요한 (예 : osk.exe) 실패한 ShellExecuteEx경우 에만 CreateProcess실패합니다. 직접 실행할 때 그래서 pythonw.exepyw.exe, 그것은 cmd를의를 상속 StandardInput, StandardOutput그리고 StandardError를 통해 (실제로 CRT) 수정을 cmd를하는 SetStdHandle전과 호출 한 후 CreateProcess표준 I / O가 파이프, 파일 또는 장치로 리디렉션됩니다.
Eryk Sun

2
cmd STARTUPINFO는 Python과 달리 핸들 (hStdInput, hStdOutput, hStdErr)을 사용하지 않습니다 subprocess.Popen. 단일 스레드 프로그램이기 때문에이 문제를 해결할 수 있습니다. ShellExecuteExGUI 쉘 API는 표준 I / O를 지원하지 않기 때문에 리디렉션이 작동하는 것은 단지이 디자인 때문입니다.
Eryk Sun


16

다른 프로세스 (예 : 명령 줄)에서 파이썬 스크립트를 호출하려면을 사용하십시오 pythonw.exe. 그렇지 않으면 사용자 cmd에게 파이썬 프로세스를 시작 하는 창이 계속 나타납니다 . 스크립트는 여전히 똑같이 실행되지만 사용자 경험에는 영향을 미치지 않습니다.

예를 들어 이메일을 보내는 경우가 있습니다. python.exeCLI 창을 열고 이메일을 보낸 다음 창을 닫습니다. 빠른 플래시처럼 보이며 다소 성가신 것으로 간주 될 수 있습니다. pythonw.exe이를 피하지만 여전히 이메일을 보냅니다.


6
사실,하지만 다시 "말하자면, 명령 줄에서"이미있는 경우 입니다 콘솔 (터미널) 창에서 다음 python.exe없는 또 다른 하나를 엽니 다.
mklement0

2

나는 이것을 잠시 동안 작동시키는 데 어려움을 겪고있었습니다. 확장명을 .pyw로 변경 한 후에는 파일의 속성을 열고 "열기"경로를 pythonw.exe로 지정하십시오.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.