【发布时间】:2014-02-26 13:44:17
【问题描述】:
我正在尝试通过标准输出将使用 subprocess.Popen() 执行的命令记录到 UDP 套接字。我在网上看到过尝试,但至少在我的情况下没有真正成功。
有些人试图继承一个套接字并将其传递给 Popen 的“stdout”参数,以覆盖默认的 .write 方法以通过套接字发送,例如,参见http://www.dreamincode.net/forums/topic/209734-using-a-socket-as-stdinstdout/
我还尝试继承“文件”类并用我的实现覆盖 write 方法,但 Popen 似乎根本没有调用任何 write 方法。
确实,这种子类化的想法行不通,原因很简单,即 Popen(args,stdout=mysocket) 不调用任何 mysocket.write(或任何 .write)方法。为了测试这一点,我在调试模式下调用了 Popen,并尝试从它的 init 单步执行到最后,但没有找到任何 .write 或类似的东西。我正在使用 python 2.7
当然我知道我可以将标准输出发送到 PIPE 然后读取它,但这需要在我的情况下创建(多个)工作线程来读取 PIPE 并发送,如果可能的话我想避免这个解决方案如果可以用更简单的方式获得更简单的方法。
我的文件子类
class Foo(file):
dbgIP = ""
dbgPORT = 0
sck = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
def __init__(self, dbgIP, dbgPORT):
file.__init__(self,"empty",'w')
self.sck.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2)
self.dbgIP = dbgIP
self.dbgPORT = dbgPORT
def write(self, text):
return self.sck.sendto(text, (self.dbgIP, self.dbgPORT))
一个示例调用
foofile = Foo(MCAST_GROUP,MCAST_PORT)
subprocess.Popen("jackd -R -P62 -dalsa -dhw:0 -p256 -n2 -i2 -o2 -s -S -r22050",shell=True, stdout=foofile, stderr=subprocess.STDOUT)
调用foofile.write("asd") 工作正常
【问题讨论】:
-
您是否尝试在
Foo.write中插入打印语句只是为了确保它没有被调用? -
是的,仔细检查,类被正确实例化(在构造函数末尾用打印检查),套接字工作(如果调用
foofile.write("asd"),但写入从未被 Popen 调用(因此没有您建议的控制台打印出现) -
Popen 实现是否及时改变?我正在运行 python 2.7.5+
-
我正在阅读
Popen的源代码,但无法了解它如何处理对标准输出的写入。据我所知,它应该有效。 -
如果没有给出任何
stdout,该命令是否会向控制台输出一些内容?