.pyw和pythonw不在Windows 7下运行
运行简单的.py或.pyw python文件会导致任务管理器下显示.pyw和pythonw不在Windows 7下运行,python,python-2.7,windows-7,pythonw,Python,Python 2.7,Windows 7,Pythonw,运行简单的.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。我不确定我是否理解您的问题,但我认为这是您需要知道的 您需要右键单击py或
python.exe
python myApp.py
python myApp.pyw
但是,当我们尝试在不使用控制台的情况下运行它时,脚本似乎不会运行,任务管理器下也不会出现python.exe
或pythonw.exe
pythonw myApp.pyw
pythonw myApp.py
我们如何解决问题?系统正在运行Python 2.7.8 x64。我不确定我是否理解您的问题,但我认为这是您需要知道的 您需要右键单击py或pyw文件,然后选择“使用打开…”。。。查找python.exe(可能是C:\Python27\python.exe)。。选中“始终打开”的框。。。现在,如果您想运行它,只需双击它
(通常安装程序会为您设置…尝试添加行
导入系统;sys.stderr=open(“errlog.txt”,“w”)
到myApp.py
的开头。然后在errlog.txt
中查找回溯或任何其他错误消息。我自己的一个脚本也遇到了同样的问题,发现在添加Ross的答案的输出时,脚本实际上会运行
由于某种原因,重定向输出似乎解决了问题。由于我对将输出写入磁盘不感兴趣,因此我使用以下命令将其写入/dev/null
(或同等平台):
if语句确保仅当脚本从
pythonw.exe
启动时才会发生。我不确定它是否相关,但在其他导入(包括导入日志记录
)之前执行此操作很重要。我遇到了类似的问题
在通过写入日志文件一步一步地调试之后,我发现pythonw.exe在尝试使用调用sys.stdout.write()的语句后崩溃。事实证明,当使用pythonw.exe运行时,sys.stdout是None
如果您正在使用sys.stdout/stderr/stdin的函数,并且打算将程序与pythonw.exe一起使用,那么添加一个“无”检查是一个好主意。tl;dr
- 要进行故障排除,请在调用时使用输出重定向:
pythonw myApp.py 1>stdout.txt 2>stderr.txt
stdout.txt
中捕获stdout输出,例如来自print()
,并在文件stderr.txt
中捕获stderr输出(例如来自未处理的异常);从PowerShell中,使用cmd/c pythonw myApp.py 1>stdout.txt 2>stderr.txt
)。请注意,重定向stdout的行为实际上可能会使脚本再次工作,如果它在
pythonw
中失败的唯一原因是使用print
(在python2.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-
%TEMP%
是一个标准的Windows环境变量,它指向当前用户的临时文件文件夹
换句话说:在上述代码就绪的情况下,在使用pythonw.exe调用脚本时,在脚本以静默方式失败后,检查文件%TEMP%\stderr-
有关解释,请继续阅读
在Windows上,pythonw.exe
用于在所有脚本上启动GUI/无UI,这意味着
标准输入和输出流--sys.stdin
,sys.stdout
,sys.stderr
不可用。
这有两个严重的副作用:
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")
- 使用
print()
-默认情况下,它以sys.stdout
为目标-会导致Python 2.x中出现异常。
- 这个问题在Python3.x中已经修复
- 任何未处理的异常-包括由2.x中的
print()
触发的异常-会导致脚本以静默方式中止。
- 默认情况下,异常错误消息会转到
sys.stderr
,这正是本场景中不可用的
上述代码通过以下方式修复了这些问题:
- 将标准输出发送到空设备,有效地忽略任何试图通过
print()
显式或隐式输出到sys.stdout
- 将所有stderr输出发送到临时文件
Python2.x和Python3.x之间的区别:
使用pythonw.exe
、sys.stdin
、sys.stdout
和sys.stderr
运行脚本时:
- Python中的2.x:具有无效的文件描述符
- 尝试写入
sys.stdout
或sys.stderr
时的最终结果是以下异常:IOError:[Errno 9]错误的文件描述符
- 陷阱:由于输出缓冲,在输出(比如4K字节)之前,此异常可能不会出现;通过使用
-u
(用于无缓冲输出)调用pythonw.exe
,可以立即触发它
print()
盲目尝试sys.stdout
(默认情况下),因此迟早会引发此异常
- 在Python中3.x:是否设置为
None
- 这是由3.x
print()
函数perform()补充的
cd E:\my\script\folder\
pythonw script.py