在python中使用stdin而不是文件调用perl脚本

时间:2016-04-06 09:00:10

标签: python perl python-2.7 subprocess

我正在运行一个perl脚本,它使用subprocess.Popen()接受来自Python的输入文件。我现在需要脚本的输入来接受来自标准输入而不是文件的输入。如果我从shell运行perl脚本:

perl thescript.perl --in /dev/stdin --other_args other_values 

完美无缺。但是,在python中,使用以下命令没有任何反应:

mytext = "hi there"
args = ["perl", "myscript.perl", "--in", "/dev/stdin", "--other_args", other_values]
pipe = subprocess.Popen(args, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
result = pipe.communicate(input=mytext.encode("utf8"))[0]`

结果总是返回空(我也尝试使用pipe.stdin.write(mytext")result=pipe.stdout.read()

请让我知道我做错了什么。

2 个答案:

答案 0 :(得分:2)

感谢上面@ J.F.Sebastian的评论,我设法用echo和pipe解决了这个问题。

args = ["perl", "myscript.perl", "--in", "/dev/stdin", "other_args", other_vals]
pipe1 = subprocess.Popen(["echo", mytext], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
pipe2 = subprocess.Popen(args, stdin=pipe1.stdout, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
pipe1.stdout.close()
result = pipe2.communicate()[0]

返回预期输出。仍然不确定原因(在问题中发布)为什么不起作用(使用通信将文本发送到标准输入)

答案 1 :(得分:0)

/dev/stdin应该可以工作(如果它在你的系统上的shell中工作):

>>> from subprocess import Popen, PIPE
>>> import sys
>>> p = Popen([sys.executable, '-c', 'print(open("/dev/stdin").read()[::-1])'],
...           stdin=PIPE, stdout=PIPE)
>>> p.communicate(b'ab')[0]
'ba\n'

stdin=PIPE创建一个管道并将其连接到子进程'标准输入。从/dev/stdin读取相当于从标准输入(0 fd)读取,因此子进程从此处读取管道,如示例所示。