python使用subprocess.Popen运行bat脚本时报不支持输入重新定向错误分析

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python使用subprocess.Popen运行bat脚本时报不支持输入重新定向错误分析相关的知识,希望对你有一定的参考价值。

参考技术A

大图请右击在新标签页打开

Popen默认shell参数为False:

为True时默认使用 COMSPEC 环境变量指定的程序为shell:

在Windows上默认为cmd:

args参数为命令字符串时,因为dir是cmd的内建命令,需要指定shell=True:
例如:

而timeout,ping等都是独立的exe,可以不需要cmd:

args参数是文件路径形式时:

底层是调用了Windows的API,如下:

调试:

测试:

从调试结果以及测试来看,对于bat文件,可以不写lpApplicationName参数,Windows会自动使用cmd来运行(使用vbs文件测试返回错误:不是正确的win32程序,要指定lpApplicationName为cscript.exe才行,可能只有bat才有这个特权了)。

输入重定向的问题:
Popen是用创建子进程的方式来执行的,而timeout.exe在暂停时,可接受用户按键来终止,这个时候会需要输入,但是Popen给子进程的stdin只有

并不能让timeout重定向到用户输入上,所以出错。

解决的方法有很多,最简单的替换掉timeout语句为ping -w xxx 127.0.0.1 或者直接由python来接管timeout。

以上是关于python使用subprocess.Popen运行bat脚本时报不支持输入重新定向错误分析的主要内容,如果未能解决你的问题,请参考以下文章

使用 subprocess.Popen 隐藏控制台

Windows 上的 Python 2.6:如何使用“shell=True”参数终止 subprocess.Popen?

为啥带有 shell=True 的 subprocess.Popen() 在 Linux 和 Windows 上的工作方式不同?

python 使用``subprocess.Popen``修复python 2.7 windows unicode问题。

解决subprocess.Popen在windows下执行命令报的KeyError: 'PATH'问题

解决subprocess.Popen在windows下执行命令报的KeyError: 'PATH'问题