将命令或脚本的输出传递给另一个Python脚本

3 投票
3 回答
5437 浏览
提问于 2025-04-16 07:09

我对Python还比较陌生,正在尝试写一个Python脚本,这个脚本可以接收其他命令或脚本的输出。

example command | python_sript.py

在这个Python脚本中,我主要是分析命令的输出,然后把结果保存到文件里。

我原以为可以通过把sys.stdin重定向到subprocess.PIPE来实现这个功能,但结果并没有成功。

sys.stdin = subprocess.PIPE

有人能建议我该怎么做吗?

另外,如果命令或脚本输出数据的速度比Python脚本处理的速度快,会发生什么呢?

注意:当我使用这个脚本时

import sys
data = sys.stdin.readline()
print(data)

我得到这个结果

D:\>echo "test" | tee.py
The process tried to write to a nonexistent pipe.
Traceback (most recent call last):
  File "D:\Profiles\Administrator\My Documents\Workspace\tee.py", line 3, in <mo
dule>
    data = sys.stdin.readline()
AttributeError: 'NoneType' object has no attribute 'readline'

而当我使用这个

import sys
data = input()
print(data)

我得到这个结果

D:\>echo "test" | tee.py
The process tried to write to a nonexistent pipe.
Traceback (most recent call last):
  File "D:\Profiles\Administrator\My Documents\Workspace\tee.py", line 3, in <mo
dule>
    data = input()
RuntimeError: input(): lost sys.stdin

3 个回答

0

问题1(从管道读取)已经有人回答过了:只需在python_script.py中读取标准输入(stdin)。操作系统会通过管道来处理重定向。

问题2(读写速度)也有答案:操作系统的管道是有缓冲区的,所以这里不需要担心。

问题3(堆栈跟踪):你的第一个程序在我这边运行得很好。- 你真的把完整的代码都给出来了吗?

关于subprocess.PIPE:你真的只想在你的Python脚本中从头开始启动一个新命令时使用这个,这样你才能和子进程进行沟通。既然你没有这样做,这对你就没什么用。命令行层面的管道并不构成父子进程。

1

你似乎对管道的工作原理有些不太清楚。管道是由操作系统来处理的,而不是由单独的程序来处理。所以,如果你写了一个Python脚本,目的是从管道中获取输入数据,那么你只需要像平常一样读取 stdin,重定向的工作会自动为你处理。数据会以生成的速度被消耗掉;如果你的脚本处理数据的速度比生成数据的速度慢,那么这些数据就会被存储在一个缓冲区里。

或者你是想在两个 Python 脚本之间进行通信?如果是这样的话,有比通过 stdinstdout 更好的方法。

4

在旧版Windows系统中,当你使用管道(pipes)时,默认情况下需要通过 python 可执行文件来调用Python脚本,这是因为有一个叫做NT重定向的错误:

D:\> echo "test" | python tee.py

之后,sys.stdinraw_input()fileinput.input() 就应该能正常工作了。

撰写回答