运行简单的.py或.pyw python文件会导致python.exe
显示在任务管理器下。
python myApp.py
python myApp.pyw
但是,当我们尝试在不使用控制台的情况下运行它时,脚本似乎不会运行,任务管理器下也不会显示python.exe
或pythonw.exe
pythonw myApp.pyw
pythonw myApp.py
我们如何解决问题?系统运行的是Python 2.7.8 x64。
答案 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()
的显式调用实际上被忽略(无操作)。%TEMP%\stderr-<scriptFileName>
; %TEMP%
是一个标准的Windows环境变量,指向当前用户的临时文件文件夹。换句话说:使用上面的代码后,在使用%TEMP%\stderr-<scriptFileName>
调用脚本静默失败后检查文件pythonw.exe
。
有关解释,请继续阅读。
在Windows上,pythonw.exe
用于启动GUI / no-UI-at-all脚本,这意味着
标准输入和输出流 - sys.stdin
,sys.stdout
,sys.stderr
不可用。
这有两个令人讨厌的副作用:
print()
- 默认情况下定位sys.stdout
- 会在Python 2.x中导致异常。
print()
触发的异常 - 导致脚本以静默方式中止 。
sys.stderr
,这是此方案中不可用的。以上代码通过以下方式解决了这些问题:
将stdout输出发送到空设备,有效地忽略任何输出到sys.stdout
的尝试 - 无论是显式还是隐式地通过print()
。
将所有stderr输出发送到临时文件。
Python 2.x和Python 3.x之间的区别:
使用pythonw.exe
,sys.stdin
,sys.stdout
和sys.stderr
运行脚本时:
sys.stdout
或sys.stderr
时的最终结果是以下例外:IOError: [Errno 9] Bad file descriptor
pythonw.exe
调用-u
来激发它(对于无缓冲输出)。print()
盲目地尝试sys.stdout
(默认情况下),因此它迟早会引发此异常。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)
这是一个陈旧的答案,但我想在此处留下我的解决方案:
使用脚本作为参数运行pythonw
cd E:\my\script\folder\
pythonw script.py
答案 6 :(得分:-1)
升级到我的计算机RAM后,我遇到了类似的问题。结果我不得不重新安装Pillow(用于图像处理的库)。所以确保它已安装,如果没有安装,请使用&#34; pip install Pillow&#34;在cmd。