【问题标题】:Passing input to subprocess popen at runtime based on stdout string基于标准输出字符串在运行时将输入传递给子进程popen
【发布时间】:2021-11-03 23:13:00
【问题描述】:

我正在尝试运行以下代码

process = subprocess.Popen(args=cmd, shell=True, stdout=subprocess.PIPE)
while process.poll() is None:
   stdoutput = process.stdout.readline()
   print(stdoutput.decode())
   if '(Y/N)' in stdoutput.decode():
       process.communicate(input=b'Y\n')

此 cmd 参数运行几分钟后会提示确认,但 process.communicate 不起作用,process.stdin.write() 也不起作用

当提示确认时,如何将输入字符串“Y”发送到正在运行的进程

【问题讨论】:

  • 您能分享一下您正在执行的cmd 的值是多少吗?
  • 它是一个自定义编写的 exe,带有一些命令行参数,几分钟后要求确认,然后继续执行

标签: python subprocess pipe stdin


【解决方案1】:

根据the docPopen.communicate(input=None, timeout=None)

注意,如果你想向进程的标准输入发送数据,你需要使用stdin=PIPE创建Popen对象。

请尝试一下,如果还不够,请说明症状是什么。

【讨论】:

  • 我更新了程序,但还是不行,脚本/进程在遇到popen.communicate()的那一刻就结束了,没有错误,但是提示失败进程终止
  • 我会想出许多关于可能出现问题的假设以及测试每个假设的方法。也许这段代码没有正确检测到“Y/N”提示,所以在它调用process.communicate()之前打印一些东西。也许子进程没有收到输入文本或者没有得到换行符或其他东西,所以让它打印输入文本或在其中设置断点,或者替换一个小的测试命令。可能子进程由于 OutOfMemory 等其他原因而失败 - 所以打印 process.poll() 返回代码和 process.communicate() 返回元组。另请参阅@NielGodfreyPonciano 的回答。
【解决方案2】:

除了@Jerry101 的回答之外,如果您调用的子进程是使用input() 的python 脚本,请注意,如文档所述:

如果提示参数存在,则将其写入标准输出没有尾随换行符

因此,如果您像在process.stdout.readline() 中那样执行readline(),它会挂在那里等待新行\n 字符,如记录:

f.readline() 从文件中读取一行;换行符 (\n) 留在字符串的末尾

快速解决方法是在请求 input() 时附加换行符 \n,例如input("(Y/N)\n") 而不仅仅是 input("(Y/N)")

相关问题:

【讨论】:

    猜你喜欢
    • 2019-05-07
    • 1970-01-01
    • 1970-01-01
    • 2015-12-12
    • 2017-03-19
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 2023-02-17
    相关资源
    最近更新 更多