我正在做一些 python 编程,我想将一个程序的输出“管道”到另一个程序。使用 sys.stdin 和 sys.stdout 很容易做到这一点。但是,我还希望能够将信息和警告消息打印到终端。是否有任何(简单)方法可以拥有多个通道,将消息打印到终端,但将数据发送到另一个程序?
4 回答
您可以stderr
用于终端输出和stdout
管道。
您可能会发现subprocess.Popen很有用。它生成另一个程序作为一个单独的进程,并允许您定义文件描述符stdin
,stdout
并stderr
根据您的意愿。
这几乎logging
就是构建模块的目的。您可以将消息记录到您可以从代码中的任何位置任意创建和命名的记录器,然后通过将处理程序附加到记录器,将数据推送到您想要的任何消费者或消费者。
如果这对你不起作用,moooeeeep 的 subprocess 建议可能是下一个最好的探索途径。这是完成与覆盖 sys.stdout 相同的事情的一种文明方式,这是只有野蛮人和体弱者应该做的事情。
正如其他人所说,stdout
用于数据和stderr
用户交互。以下是在最近的 python 版本(即 3.x 和 2.6 或更高版本)中如何做到这一点:
import sys
print("data", file=sys.stdout)
print("more data") # sys.stdout is the default
print("user interaction", file=sys.stderr)
结果:
#!/usr/bin/env python
desktop➜ ~ ./tmp.py
data
more data
user interaction
desktop➜ ~ ./tmp.py > /dev/null
user interaction
desktop➜ ~ ./tmp.py 2&> /dev/null
data
more data
老实说,当我想快速做到这一点时,我不会弄乱代码,我只是使用 tee。它是一个 *nix 实用程序,可以完成您所说的拆分管道以进行显示和管道的操作。您可以进一步限制使用 grep 显示的内容。非常适合调试使用管道的东西。如果这是您的生产系统的一部分,尽管除非您必须这样做,否则我可能不会使用管道传递信息。如果这样做,请记录您的错误/警告和 tail -f 您的日志。
我不知道真正的 python 答案,但它完成了工作。