【发布时间】:2015-03-19 05:26:57
【问题描述】:
我正在尝试 cat 文件的内容并将其通过管道传输到第二个 python 脚本的标准输入中,然后将其标准输出放入另一个文件中。
在命令行上看起来像这样:
cat input_file | python3 ~/Desktop/python_script.py > output_file
我在阅读了许多帖子后尝试这样做
file_input = subprocess.Popen(('cat', input_file), stdout=subprocess.PIPE)
file_output = subprocess.check_output(('python3', '~/Desktop/mdparser.py'), stdin=file_input.stdout, stdout=subprocess.PIPE)
subprocess.check_output('>','output_file',stdin = file_output.stdout)
但是第二行出现以下错误:
File "/usr/local/Cellar/python3/3.4.1/Frameworks/Python.framework/Versions/3.4/lib/python3.4/subprocess.py", line 598, in check_output
raise ValueError('stdout argument not allowed, it will be overridden.')
ValueError: stdout argument not allowed, it will be overridden.
【问题讨论】:
-
您不需要也不应该使用
cat来执行此命令。python3 python_script.py <input_file >output_file的效率要高得多。 -
...因此,
stdin调用subprocess应直接指向输入文件的句柄。 -
...而且,
>根本不是一个过程,所以不知道你想在那里做什么;它不应该有自己的subprocess.Popen对象;相反,第二个进程上的stdout应该直接指向文件句柄,而不是指向 PIPE,如果您希望它转到文件。 -
您应该将必要的功能放入函数、类中并导入模块,而不是将其作为子进程运行。如果您不想更改脚本;您可以将
sys.stdin、sys.stdout设置为文件对象并调用runpy.run_path()。
标签: python-3.x pipe subprocess cat