【问题标题】:passing subprocess run prompt input in python在python中传递子进程运行提示输入
【发布时间】:2022-01-04 13:26:25
【问题描述】:

我正在使用 subprocess.run 中的输入使用 python 子进程传递用户输入

dargs = ['java','-jar','cli.jar','ion','-cf', config_path, '-r', deldata.get("reg"), '-n', deldata.get("space"), '-e', deldata.get("tion"), '-c', listargs[2], '-f', 'true']
dresp = subprocess.run(dargs, text=True, capture_output=True, input="yes")

这会返回以下错误:

returned non-zero exit status 1.
When calling: subprocess.run(dargs, text=True, capture_output=True, check=True, input="yes")

但如果我从终端执行相同的操作,它工作正常

java -jar cli.jar ion -r DUB -n oa -cf /config/path -e test -c ht -f true

上述命令输出以下内容并要求用户在终端中输入这样的内容

this is force operation.
V Id: sl, Desc: ht
Confirm operation: (yes/no)yes #----->here comes my user input to terminal
Operation done successfully

从终端触发的命令首先输出这两行

this is force operation.
V Id: sl, Desc: ht 

然后等待一段时间,然后请求输入 确认操作:(是/否)

不确定如何使子进程不通过管道发送yes 输入,而是等待提示并检查此行Confirm operation: (yes/no),然后将输入提供为yesno

我相信我当前的代码可以执行 yes | java -jar cli.jar ion -r DUB -n oa -cf /config/path -e test -c ht -f true cli 不例外的那种操作。

任何关于如何实现这一点的帮助都会很棒

【问题讨论】:

  • 您可以尝试使用来自stackoverflow.com/a/48787335/7916438 的部分,它展示了如何将输入发送到subprocess。我不确定输出部分,在终端中可能根本不需要重定向它,它只会出现。
  • @tevemadar 据我所知,提供 input="whatever" 有效吗?并且您提供的参考是 subprocess.popen

标签: python python-3.x python-2.7 subprocess


【解决方案1】:

尝试在输入参数 (input="yes\r", ...) 中的字符串末尾传递一个 \r。此外,这取决于“cli.jar”与 Python 脚本位于同一文件夹中,并从该文件夹中调用 Python 脚本。将完整的绝对路径添加到“cli.jar”会有所帮助。

有趣的是,如果不将“check=True”传递给 subprocess.run,程序不会中断:您只会在您的 dresp 程序上获得失败的运行信息,然后您可以打印它以获取任何信息打印出您尝试运行的程序(由于 capture_output=True)。

如果它不起作用,请尝试分步解决您的问题,例如尝试先运行java -version,这样您就可以断言Java解释器正在被定位并成功运行。此外,如果您的程序在调用时没有中断,只需在此处添加 print(dresp)

【讨论】:

  • 我将 cli.jar 保存在同一路径中,该路径在我正在运行的其他子进程命令中运行良好,无需传递输入。我删除了check=True java 解释器也可以正常工作,因为其他子进程命令正在运行。而是当我在输入中添加yes\r 时,它现在确实接受了输入,但看起来该过程已完成,然后它为子进程提供了值..至少它没有因上一个错误而退出,但仍然没有解决问题
  • 是否可以在延迟一段时间后传递输入?
  • 我发现了问题,但不确定解决方案是什么,如果我通过管道输入并发送它实际上会失败。在我上面的代码中,子进程与此终端中的操作相同,我相信yes | java -jar cli.jar ion -r DUB -n oa -cf /config/path -e test -c ht -f true cli 在执行方面有这样的限制,python 中的任何解决方法都可以传递输入吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-15
  • 2022-11-11
  • 2014-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-03
相关资源
最近更新 更多