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

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

Popen默认shell参数为False:


1
1

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


2
2

在Windows上默认为cmd:


3
3

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


4
4

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


5
5

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


6
6

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


7
7

调试:


8
8

测试:


11
11

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

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


10
10

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 个人学习批处理的初衷来源于实际工作;在某个迭代版本有个BS(安卓手游模拟器)大需求,从而在测试过程中就重复涉及到...
    Luckykailiu阅读 4,792评论 0 11
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,010评论 19 139
  • win7 cmd管理员权限设置 net localgroup administrators 用户名 /add 把“...
    f675b1a02698阅读 5,389评论 0 11
  • 部分内容转载自搜狗百科 cmd是command的缩写.即命令提示符(CMD),是在OS / 2 , Windows...
    青冥之上阅读 2,429评论 0 24
  • 处于学习别人代码风格阶段,github参考学习程序程序开头会有 一是用来指定脚本语言为 Python,二是用来指定...
    lifesmily阅读 1,094评论 0 0