.pyw和pythonw不在Windows 7下运行

Nyx*_*nyx 20 python windows-7 pythonw python-2.7

运行简单的.py或.pyw python文件会导致python.exe显示在任务管理器下.

python myApp.py
python myApp.pyw
Run Code Online (Sandbox Code Playgroud)

然而,当我们尝试不使用控制台运行,该脚本不会出现跑,也不python.exepythonw.exe在任务管理器中出现

pythonw myApp.pyw
pythonw myApp.py
Run Code Online (Sandbox Code Playgroud)

我们如何解决问题?系统运行的是Python 2.7.8 x64.

mkl*_*nt0 27

TL;博士

这将捕获文件中的stdout输出,例如from print(),in,file stdout.txt和stderr输出(例如来自未处理的异常)stderr.txt; 来自PowerShell,使用
cmd /c pythonw myApp.py 1>stdout.txt 2>stderr.txt).
请注意,重定向stdout的行为实际上可能会使您的脚本再次运行,如果它失败的唯一原因pythonw是使用print(在Python 2.x中 - 见下文).
警告:此输出重定向技术貌似也没有调用时工作*.pyw的脚本直接(如通过将脚本文件路径反对pythonw.exe).如果您知道原因和/或它是否适合您,请告诉我.

  • 修复脚本:

将以下内容放在运行pythonw.exe的任何Python 2.x或3.x脚本的顶部:

import sys, os
if sys.executable.endswith("pythonw.exe"):
  sys.stdout = open(os.devnull, "w");
  sys.stderr = open(os.path.join(os.getenv("TEMP"), "stderr-"+os.path.basename(sys.argv[0])), "w")
Run Code Online (Sandbox Code Playgroud)

这可以确保在运行脚本时执行以下操作pythonw.exe:

  • print()调用和显式调用sys.stdout()被有效忽略(是无操作).
  • Stderr输出,包括来自未处理的致命异常,被发送到文件 %TEMP%\stderr-<scriptFileName>; %TEMP%是一个标准的Windows环境变量,指向当前用户的临时文件文件夹.

换句话说:使用上面的代码,在脚本在调用时以静默方式失败后检查文件%TEMP%\stderr-<scriptFileName>pythonw.exe.

有关解释,请继续阅读.


在Windows上,pythonw.exe是用于启动GUI /无UI不惜一切的脚本,这意味着标准输入和输出流- ,,sys.stdin 不可用.sys.stdoutsys.stderr

这有两个令人讨厌的副作用:

  • 使用print() - sys.stdout默认情况下使用哪些目标- 会导致Python 2.x中出现异常.
    • Python 3.x中已修复此问题.
  • 任何未处理的异常(包括由print()2.x 触发的异常)都会导致脚本以静默方式中止.
    • sys.stderr默认情况下会出现异常错误消息,这是此方案中不可用的内容.

上面的代码修复了这些问题:

  • 将stdout输出发送到空设备,有效地忽略任何输出尝试sys.stdout- 无论是显式还是隐式通过print().

  • 将所有stderr输出发送到临时文件.


Python 2.x和Python 3.x之间的差异:

当一个脚本与运行pythonw.exe, sys.stdin,sys.stdout,和sys.stderr:

  • 在Python 2.x中:具有无效的文件描述符
    • 尝试写入时的最终结果sys.stdout或是sys.stderr以下异常:IOError: [Errno 9] Bad file descriptor
    • 陷阱:由于输出缓冲,在您输出4K字节之前,此异常可能不会浮出水面 ; 您可以立即通过调用它挑起pythonw.exe-u(非缓冲输出).
    • print()盲目地尝试sys.stdout(默认情况下),所以它迟早会引发这个例外.
  • 在Python 3.x中:设置为None
    • 这是补充了3.x的print()执行功能,无操作(什么都不做),当它发现sys.stdoutNone,所以print()默认情况下可以安全使用说明-他们会简单地忽略时运行pythonw.exe
    • 然而,它遵循的是试图使用sys.stdout.write()sys.stderr.write()仍导致异常.

有关更多背景,请参见此处


Ros*_*dge 5

尝试将该行添加import sys; sys.stderr = open("errlog.txt", "w")myApp.py. 然后查找errlog.txt回溯或任何其他错误消息。


Jor*_*ley -1

我不确定我是否理解你的问题,但我认为这是你需要知道的

您需要右键单击 py 或 pyw 文件并选择打开方式...找到 python.exe (可能是 C:\Python27\python.exe) .. 选中始终打开的框...现在您可以双击如果你想运行它,请点击它

(通常安装程序会为您设置...)