将命令或脚本的输出传递给另一个Python脚本
我对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 个回答
问题1(从管道读取)已经有人回答过了:只需在python_script.py中读取标准输入(stdin)。操作系统会通过管道来处理重定向。
问题2(读写速度)也有答案:操作系统的管道是有缓冲区的,所以这里不需要担心。
问题3(堆栈跟踪):你的第一个程序在我这边运行得很好。- 你真的把完整的代码都给出来了吗?
关于subprocess.PIPE:你真的只想在你的Python脚本中从头开始启动一个新命令时使用这个,这样你才能和子进程进行沟通。既然你没有这样做,这对你就没什么用。命令行层面的管道并不构成父子进程。
你似乎对管道的工作原理有些不太清楚。管道是由操作系统来处理的,而不是由单独的程序来处理。所以,如果你写了一个Python脚本,目的是从管道中获取输入数据,那么你只需要像平常一样读取 stdin
,重定向的工作会自动为你处理。数据会以生成的速度被消耗掉;如果你的脚本处理数据的速度比生成数据的速度慢,那么这些数据就会被存储在一个缓冲区里。
或者你是想在两个 Python 脚本之间进行通信?如果是这样的话,有比通过 stdin
和 stdout
更好的方法。
在旧版Windows系统中,当你使用管道(pipes)时,默认情况下需要通过 python
可执行文件来调用Python脚本,这是因为有一个叫做NT重定向的错误:
D:\> echo "test" | python tee.py
之后,sys.stdin
、raw_input()
和 fileinput.input()
就应该能正常工作了。