【问题标题】:Python subprocess command answering promptPython子进程命令应答提示
【发布时间】:2018-05-12 07:03:36
【问题描述】:

我正在尝试调用命令

ionic cordova prepare

提示“是/否”响应。我一直希望这是肯定的。当我尝试使用 os.system 时,它会挂在最后一部分,而不是移动到脚本的其余部分。有谁知道正确的写法。

这是我尝试过的

foo_proc = Popen(['ionic', 'cordova', 'prepare'], stdin=PIPE, stdout=PIPE)
yes_proc = Popen(['yes', 'y'], stdout=foo_proc.stdin)
foo_proc.communicate()[0]
yes_proc.wait()

但它只是挂在命令上,似乎没有执行

【问题讨论】:

  • 只有一个提示?那么,为什么要运行 yes_proc 而不是 foo_proc.communicate('y\n') 将单个 y 传递给 foo_proc 的标准输入?
  • 你的意思是运行 foo_proc = Popen(['ionic', 'cordova', 'prepare'], stdin=PIPE, stdout=PIPE) foo_proc.communicate('y\n') 当我这样做时这似乎只是跳过命令。它永远不会执行
  • 我的意思是运行什么?顺便说一句,将['ionic', 'cordova', 'prepare'] 更改为['head', '-n', '1'] 时无法重现此问题,这意味着此ionic 命令存在特定的问题。
  • 上面的代码确实执行了foo_proc。检查foo_proc.returncode——你会看到它被设置为一个数值,而在程序运行之前它是None
  • 顺便说一句,如果 stdin 是 TTY,许多表现良好的程序只会提示,但如果 stdin 是非TTY 对象,例如管道。我不知道这个“离子”工具,不管它是什么,但你可能会考虑沿着这些方向发展的潜力。扔掉标准错误,而不是记录它——尤其是在调试错误时! -- 很可能……对你的事业没有帮助。

标签: python shell process scripting subprocess


【解决方案1】:

从 python 3.5 开始,subprocess 模块引入了高级run 方法,该方法返回一个CompletedProcess 对象:

subprocess.run(['somecommand', 'somearg'], capture_output=True, text=True, input="y")

参见文档here

【讨论】:

    【解决方案2】:

    这对我有用:

    foo_proc = Popen(['ionic', 'cordova', 'prepare'], stdin=PIPE, stdout=PIPE)
    foo_proc.stdin.write(b"y\n")
    outputlog, errorlog = foo_proc.communicate()
    foo_proc.stdin.close()
    

    【讨论】:

      【解决方案3】:

      我在沟通几个 Y/N/ 以回答使用子进程启动的脚本时也遇到了问题......没有任何效果,我最终没有找到任何好的“干净”解决方案,所以我使用了一个技巧: 我在其中编写了一个 bash 脚本 (launch_script.sh):

      echo -e "Y\nN\nY\n" | scripttoanswer.ksh
      

      在其中,然后使用子进程简单地启动它:

      subprocess.run(["/home/user/dev/my_project/launch_script.sh"], shell=True)
      

      【讨论】:

        【解决方案4】:

        同意 Charles duffy 的例子,也许这对你有帮助!!

        from subprocess import Popen,PIPE
        foo_proc = Popen(['ionic', 'cordova', 'prepare'], stdin=PIPE, stdout=PIPE)
        foo_proc.communicate(input='y')
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-10-28
          • 2013-07-30
          • 2021-05-15
          • 2013-03-23
          • 1970-01-01
          • 2019-07-20
          相关资源
          最近更新 更多