【问题标题】:Send input (command) with communicate to created Subprocess Python发送输入(命令)并与创建的子进程 Python 通信
【发布时间】:2018-04-16 02:08:52
【问题描述】:

我创建了一个 Subprocess 对象。子进程调用一个 shell,我需要将下面提供的 shell 命令发送给它。我试过的代码:

from subprocess import Popen, PIPE

p = Popen(["code.exe","25"],stdin=PIPE,stdout=PIPE,stderr=PIPE)
print p.communicate(input='ping 8.8.8.8')

命令不执行,shell 没有输入任何内容。提前致谢。

【问题讨论】:

  • 你检查过你进程的stderr吗?
  • 是的,它是空的。我认为
  • 所以你的 code.exe 生成了一个 shell?
  • 是的,它产生了外壳
  • 等等,你为什么要打印 p.communicate 函数?

标签: python subprocess pipe popen communicate


【解决方案1】:

如果我模拟code.exe读取arg然后处理stdin:

#!/usr/bin/env bash
echo "arg: $1"
echo "stdin:"
while read LINE
do
  echo "$LINE"
done < /dev/stdin

并稍微更新您的代码:

import os
from subprocess import Popen, PIPE

cwd = os.getcwd()
exe = os.path.join(cwd, 'foo.sh')
p = Popen([exe, '25'], stdin=PIPE, stdout=PIPE, stderr=PIPE)
out, err = p.communicate(input='aaa\nbbb\n')
for line in out.split('\n'):
    print(line)

然后生成的进程输出:

arg: 25
stdin:
aaa
bbb

如果在没有 \n 的情况下更改输入:

out, err = p.communicate(input='aaa')

然后就不出现了:

arg: 25
stdin:

Process finished with exit code 0

因此,您可能需要仔细查看管道两端之间的协议。例如,这可能就足够了:

input='ping 8.8.8.8\n'

希望对您有所帮助。

【讨论】:

  • 为什么我的子进程与它通信一次后就死掉了?在第二次它说:你正在写入一个关闭的文件。
  • 如果您提交一个显示您的代码的问题,它会更容易回答。理想情况下,您已经登录您的子进程来解释它终止的原因。
猜你喜欢
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 2019-06-02
  • 2012-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多