9

我的 Python 脚本中有一个标志,它指定我是否设置和使用外部进程。这个过程是一个被调用的命令my_command,它从标准输入中获取数据。如果我要在命令行上运行它,它会是这样的:

$ my_command < data > result

我想使用 Python 脚本data通过修改标准输入并将其提供给my_command.

我正在做这样的事情:

import getopt, sys, os, stat, subprocess

# for argument's sake, let's say this is set to True for now
# in real life, I use getopt.getopt() to decide whether this is True or False
useProcess = True

if useProcess:
    process = subprocess.Popen(['my_command'], stdin=subprocess.PIPE, stdout=subprocess.PIPE)

for line in sys.stdin:
    # parse line from standard input and modify it
    # we store the result in a variable called modified_line
    modified_line = line + "foo"

    # if we want to feed modified_line to my_command, do the following:
    if useProcess:
        process.stdin.write(modified_line)

    # otherwise, we just print the modified line
    else:
        print modified_line

但是,它的my_command行为就好像它没有收到任何数据并以错误状态退出。我究竟做错了什么?

编辑

假设我的 Python 脚本名为my_Python_script. 假设我通常会传递一个通过标准输入my_command调用的文件:data

$ my_command < data > result

但现在我将其传递给my_Python_script

$ my_Python_script < data > some_other_result

我想my_Python_script有条件地设置一个my_command在内容上运行的子进程(在传递给之前被data修改)。这更有意义吗?my_Python_scriptmy_command

如果我bash用作脚本语言,我会有条件地决定运行两个函数之一。一种是将数据线传输到my_command. 另一个不会。这可以用 Python 完成吗?

4

3 回答 3

10

写入标准输入后,您需要将其关闭:

    process.stdin.write(modified_line)
    process.stdin.close()

更新

我没有注意到它process.stdin.write()是在 for 循环中执行的。在这种情况下,您应该将 移到process.stdin.close()循环之外。

此外,Raymond 提到我们也应该跟process.wait()注。所以更新后的代码应该是:

for ...
    process.stdin.write(modified_line)

process.stdin.close()
process.wait()
于 2013-03-09T01:11:58.890 回答
3

除了process.stdin.close()@HaiVu 提到的那样,您是否process.wait()在获得结果之前等待命令完成?

于 2013-03-09T02:19:22.903 回答
0

看起来您可能会混淆参数和标准输入。你的命令应该是

$ <data> | mycommand result

一旦命令被调用,数据就会被传入。

raw_input使用内置函数完成输入。(http://docs.python.org/2/library/functions.html

于 2013-03-09T00:57:04.420 回答