pythonw.exe hay python.exe?


156

Câu chuyện dài: pythonw.exekhông làm gì, python.exekhông chấp nhận điều gì (tôi nên sử dụng cái nào?)

kiểm tra:

print "a"

Cửa sổ 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>

Hãy nói cho tôi biết tôi đang làm gì sai.


14
Thật không may, điều này xen kẽ hai khía cạnh python vs pythonw (nói chung là khía cạnh thú vị hơn) và một số thay đổi cú pháp cơ bản từ python2 sang python3. không có những lời chỉ trích của OP người không thể biết trước, nhưng dù sao nó taints giá trị của câu hỏi này là các đi-đến tài nguyên về python w .
mnagel

Câu trả lời:


170

Nếu bạn không muốn một cửa sổ đầu cuối bật lên khi bạn chạy chương trình của mình, hãy sử dụng pythonw.exe;
Nếu không, sử dụngpython.exe

Về lỗi cú pháp: print hiện là một hàm trong 3.x
Vì vậy, hãy sử dụng thay thế:

print("a")

282

Để tóm tắt và bổ sung cho các câu trả lời hiện có:

  • python.exelà một ứng dụng giao diện điều khiển (thiết bị đầu cuối) để khởi chạy các tập lệnh loại CLI .

    • Trừ khi chạy từ cửa sổ giao diện điều khiển hiện có, python.exe mở cửa sổ giao diện điều khiển mới .
    • Chuẩn suối sys.stdin , sys.stdoutsys.stderrđược kết nối với cửa sổ giao diện điều khiển .
    • Thực thi là đồng bộ khi được khởi chạy từ cmd.execửa sổ bảng điều khiển PowerShell: Xem bình luận đầu tiên của eryksun bên dưới.

      • Nếu một cửa sổ giao diện điều khiển mới được tạo, nó sẽ mở cho đến khi tập lệnh kết thúc.
      • Khi được gọi từ cửa sổ giao diện điều khiển hiện có, lời nhắc sẽ bị chặn cho đến khi tập lệnh kết thúc.
  • pythonw.exelà một ứng dụng GUI để khởi chạy GUI / no-UI-at-all .

    • KHÔNG có cửa sổ giao diện điều khiển được mở.
    • Thực thi là không đồng bộ :
      • Khi được gọi từ cửa sổ giao diện điều khiển, tập lệnh chỉ được khởi chạy và lời nhắc trở lại ngay lập tức, cho dù tập lệnh có còn chạy hay không.
    • Chuẩn suối sys.stdin , sys.stdoutsys.stderrKHÔNG có sẵn .
      • Thận trọng : Trừ khi bạn thực hiện các bước bổ sung , điều này có thể có tác dụng phụ không mong muốn :
        • Các trường hợp ngoại lệ chưa được xử lý khiến kịch bản hủy bỏ âm thầm .
        • Trong Python 2.x, chỉ cần cố gắng sử dụng print()có thể khiến điều đó xảy ra (trong 3.x, print()đơn giản là không có hiệu lực).
        • Để ngăn chặn điều đó từ trong kịch bản của bạn và để tìm hiểu thêm, hãy xem câu trả lời này của tôi.
        • Đặc biệt , bạn có thể sử dụng chuyển hướng đầu ra : Cảm ơn, @handle.
          pythonw.exe yourScript.pyw 1>stdout.txt 2>stderr.txt
          (từ PowerShell
          cmd /c pythonw.exe yourScript.pyw 1>stdout.txt 2>stderr.txt:) để chụp đầu ra stdout và stderr trong các tệp .
          Nếu bạn tự tin rằng việc sử dụng print()là lý do duy nhất khiến tập lệnh của bạn thất bại trong âm thầm pythonw.exevà bạn không quan tâm đến đầu ra xuất chuẩn, hãy sử dụng lệnh @ handle từ các nhận xét:
          pythonw.exe yourScript.pyw 1>NUL 2>&1
          Caveat : Kỹ thuật chuyển hướng đầu ra này không hoạt động khi gọi trực tiếp*.pyw tập lệnh ( trái ngược với việc chuyển đường dẫn tệp tập lệnh tới ). Xem bình luận thứ 2 của eryksun và các phần tiếp theo của nó bên dưới.pythonw.exe

Bạn có thể kiểm soát tập tin thực thi nào chạy tập lệnh của bạn theo mặc định - chẳng hạn như khi được mở từ Explorer - bằng cách chọn phần mở rộng tên tệp đúng :

  • *.py các tệp theo mặc định được liên kết (được gọi) với python.exe
  • *.pyw các tệp theo mặc định được liên kết (được gọi) với pythonw.exe

1
PS: Nó hoạt động khi tôi đặt stdout và stderr ở đâu đó: > pythonw ls.pyw >nul 2>&1(mặc dù không có gì được viết).
xử lý

1
Hành vi đồng bộ và không đồng bộ này chỉ từ dấu nhắc lệnh tương tác cmd.exe mà không sử dụng startlệnh. Nó thực sự kiểm tra PEBquy trình con để xác định xem đó có phải là quy trình điều khiển không. Quá trình máy chủ bàn điều khiển (conhost.exe) không quan tâm đến điều này. Nếu bạn sử dụng subprocess.Popenđể đính kèm một python.exephiên bản khác vào bảng điều khiển hiện tại và không waitsử dụng nó, thì bạn sẽ có một mớ hỗn độn khó hiểu của cả hai quá trình đua nhau truy cập bảng điều khiển cùng một lúc.
Eryk CN

2
Một quy trình chế độ người dùng được tạo bởi cuộc gọi hệ thống NtCreateUserProcess. Nếu thực thi mục tiêu là một chương trình điều khiển, hệ thống sẽ thừa hưởng vô điều kiện các điều khiển tiêu chuẩn của cha mẹ. Nhưng đối với một chương trình không có bàn điều khiển, nó đòi hỏi phải được thông báo rõ ràng để kế thừa các thẻ điều khiển kế thừa của cha mẹ. Để chạy tệp dựa trên liên kết tệp, các lệnh gọi cmd ShellExecuteEx, không rõ ràng kế thừa xử lý khi nó gọi CreateProcess=> NtCreateUserProcess. Do đó, chuyển hướng I / O tiêu chuẩn hoạt động trong cmd khi khởi động các kịch bản lệnh .py nhưng không phải là các kịch bản lệnh .pyw không có giao diện điều khiển.
Eryk CN

2
Các vỏ cmd đầu tiên cố gắng CreateProcessvới bInheritHandlesthông qua như TRUE. Nó chỉ rơi lại ShellExecuteExkhi CreateProcessthất bại vì mục tiêu không phải là tệp thực thi PE (ví dụ: tập lệnh .py) hoặc yêu cầu độ cao (ví dụ: osk.exe). Vì vậy, khi bạn trực tiếp chạy pythonw.exehay pyw.exe, nó sẽ kế thừa của cmd StandardInput, StandardOutputStandardError, trong đó cmd (thực sự là CRT) Sửa qua SetStdHandletrước và sau khi gọi CreateProcesskhi tiêu chuẩn I / O được chuyển hướng đến một đường ống, tập tin, hoặc thiết bị.
Eryk CN

2
Lưu ý rằng cmd không sử dụng STARTUPINFOtay cầm (hStdInput, hStdOutput, hStdErr), không giống như Python subprocess.Popen. Nó có thể thoát khỏi điều này bởi vì nó là một chương trình đơn luồng. Điều này chỉ do thiết kế này mà chuyển hướng hoàn toàn hoạt động với ShellExecuteEx(chỉ dành cho các chương trình giao diện điều khiển, như đã lưu ý) bởi vì API vỏ GUI không hỗ trợ cho I / O tiêu chuẩn.
Eryk CN


16

Nếu bạn định gọi một kịch bản python từ một số quy trình khác (giả sử, từ dòng lệnh), hãy sử dụng pythonw.exe. Nếu không, người dùng của bạn sẽ liên tục thấy một cmdcửa sổ khởi chạy tiến trình python. Nó vẫn sẽ chạy tập lệnh của bạn giống nhau, nhưng nó sẽ không xâm phạm vào trải nghiệm người dùng.

Một ví dụ có thể là gửi email; python.exesẽ bật lên một cửa sổ CLI, gửi email, sau đó đóng cửa sổ. Nó sẽ xuất hiện dưới dạng đèn flash nhanh và có thể được coi là hơi khó chịu. pythonw.exetránh điều này, nhưng vẫn gửi email.


6
Đúng, nhưng lại "chẳng hạn, từ dòng lệnh": Nếu bạn đã trong một cửa sổ giao diện điều khiển (terminal), sau đó python.exesẽ không mở một số khác.
mkuity0

2

Tôi đã vật lộn để có được điều này để làm việc trong một thời gian. Khi bạn thay đổi tiện ích mở rộng thành .pyw, hãy đảm bảo rằng bạn mở các thuộc tính của tệp và hướng đường dẫn "mở bằng" tới pythonw.exe.


-4

Theo kinh nghiệm của tôi, pythonw.exe nhanh hơn ít nhất là sử dụng pygame.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.