1

我创建了一个 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 中。提前致谢。

4

1 回答 1

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'

希望有帮助。

于 2017-11-04T10:52:25.610 回答