.pyw和pythonw不在Windows 7下运行

时间:2014-07-18 23:23:30

标签: python python-2.7 windows-7 pythonw

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

python myApp.py
python myApp.pyw

但是,当我们尝试在不使用控制台的情况下运行它时,脚本似乎不会运行,任务管理器下也不会显示python.exepythonw.exe

pythonw myApp.pyw
pythonw myApp.py

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

7 个答案:

答案 0 :(得分:26)

<强> TL;博士

  • 排查,请在调用时使用输出重定向

    pythonw myApp.py 1>stdout.txt 2>stderr.txt
    

这将捕获文件print()中的stdout输出,例如来自文件stdout.txt中的stderr.txt,以及文件cmd /c pythonw myApp.py 1>stdout.txt 2>stderr.txt中的stderr输出(例如来自未处理的异常);从PowerShell,使用
pythonw)。
请注意,重定向stdout的行为实际上可能会使您的脚本再次运行如果 print失败的唯一原因是使用{{1 (在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")

当使用pythonw.exe运行脚本时,这可确保以下内容:

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

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

有关解释,请继续阅读。

在Windows上,pythonw.exe用于启动GUI / no-UI-at-all脚本,这意味着 标准输入和输出流 - sys.stdinsys.stdoutsys.stderr不可用。

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

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

以上代码通过以下方式解决了这些问题:

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

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

Python 2.x和Python 3.x之间的区别:

使用pythonw.exesys.stdinsys.stdoutsys.stderr运行脚本时:

    Python中
  • 2.x 无效的文件描述符
    • 尝试写入sys.stdoutsys.stderr时的最终结果是以下例外:IOError: [Errno 9] Bad file descriptor
    • 陷阱:由于输出缓冲,在您输出(例如4K字节)之前,此异常可能不会浮出水面;您可以通过pythonw.exe调用-u来激发它(对于无缓冲输出)。
    • print()盲目地尝试sys.stdout(默认情况下),因此它迟早会引发此异常。
  • Python中的
  • 3.x 设置为None
    • 当发现print()sys.stdout时,执行 no-op (无所事事)的3.x None函数补充了这一点,所以默认情况下可以安全地使用print()语句 - 当使用pythonw.exe
    • 运行时,它们将被忽略
    • 但是,尝试使用sys.stdout.write()sys.stderr.write()仍会导致异常。

有关更多背景信息,请参阅here

答案 1 :(得分:4)

尝试将行import sys; sys.stderr = open("errlog.txt", "w")添加到myApp.py的开头。然后查看errlog.txt中的追溯或任何其他错误消息。

答案 2 :(得分:2)

我在自己的脚本上遇到了同样的问题,发现在添加Ross&#39;回答脚本实际上会运行。

出于某种原因,重定向输出似乎解决了问题。由于我对将输出写入磁盘不感兴趣,而是将其写入/dev/null(或等效平台):

if ( sys.platform == 'win32' and sys.executable.split( '\\' )[-1] == 'pythonw.exe'):
    sys.stdout = open(os.devnull, 'w')
    sys.stderr = open(os.devnull, 'w')

if语句确保仅在从pythonw.exe启动脚本时才会发生。我不确定它是否相关,但在其他导入(包括例如import logging)之前执行此操作非常重要。

答案 3 :(得分:1)

我遇到了类似的问题。

通过写入日志文件逐步调试后,我发现pythonw.exe在尝试使用该调用的语句后崩溃:sys.stdout.write()。事实证明,当使用pythonw.exe运行时,sys.stdout为None。

如果您正在使用sys.stdout / stderr / stdin的函数,并打算将您的程序与pythonw.exe一起使用,请添加一个检查&#34;无&#34;是一个好主意。

答案 4 :(得分:-1)

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

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

(通常安装人员会为你设置......)

答案 5 :(得分:-1)

这是一个陈旧的答案,但我想在此处留下我的解决方案:

  • 打开CMD(是否提升权限 - 取决于您的需求)
  • 更改为.py / .pyw脚本目录 - 这很重要
  • 使用脚本作为参数运行pythonw

    cd E:\my\script\folder\
    pythonw script.py
    

答案 6 :(得分:-1)

升级到我的计算机RAM后,我遇到了类似的问题。结果我不得不重新安装Pillow(用于图像处理的库)。所以确保它已安装,如果没有安装,请使用&#34; pip install Pillow&#34;在cmd。