Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python子进程?_Python_Subprocess - Fatal编程技术网

Python子进程?

Python子进程?,python,subprocess,Python,Subprocess,我想我可能是在重复这个问题,但我没有找到任何符合我要求的答案。 请原谅我的无知 我有一个程序在运行,它不断地从服务器中吐出一些二进制数据。它永远不会停止,直到它被杀死 我想将其包装在python脚本中,以读取输出并在其到达时对其进行处理。 我在stack overflow中尝试了一些子流程的想法,但没有用。 请建议 p=subprocess.popen(args,stderr=PIPE,stdin=PIPE,stdout=PIPE,shell=FALSE) #p.communicate#bloc

我想我可能是在重复这个问题,但我没有找到任何符合我要求的答案。 请原谅我的无知

我有一个程序在运行,它不断地从服务器中吐出一些二进制数据。它永远不会停止,直到它被杀死

我想将其包装在python脚本中,以读取输出并在其到达时对其进行处理。 我在stack overflow中尝试了一些子流程的想法,但没有用。 请建议

p=subprocess.popen(args,stderr=PIPE,stdin=PIPE,stdout=PIPE,shell=FALSE)
#p.communicate#blocks forever as expected
#p.stdout.read/readlines/readline-->blocks
#select(on p.stdout.fileno())-->blocks

最好的方法是什么?

以长度限制阅读:

proc = subprocess.Popen(args, stdin=None, stdout=subprocess.PIPE, stderr=None)
while True:
    chunk = proc.stdout.read(1024)
    # chunk is <= 1024 bytes

您可以运行另一个程序,将其输出定向到一个文件,然后使用Python的f.readline()跟踪该文件。

听起来您可以使用。有关更多信息,请查看开发人员的。

这不起作用:{self.p=subprocess.Popen(args,stdin=None,stderr=None,stdout=subprocess.PIPE,shell=False)#out,err=p.communicate()print self.p.stdout而True:chunk=self.p.stdout.read(1024)self.p.stdout.flush()打印“打印块”打印块}此代码看起来正确@你能更准确地说“它不工作”吗?我的只是在read()中无限期地等待,永远不会返回。我可以看到正在运行的进程(来自popen)使用ps。它确实捕获了我的键盘中断和退出。但是当同一个命令在命令行中正常工作时,它不会吐出任何内容。嗨,Raymond,我想到了。但是当数据包到达时,吐出数据的程序会吐出数据包,我需要捕获整个数据包并处理/重定向。再次从readline编写数据包重建逻辑会很麻烦。我只有处理数据包的逻辑,而没有组装的逻辑。我正在考虑再试一次方法../datagenerator | myprogram.py.有什么想法吗?我会尝试一下。我想补充一点,生成的数据是一个http流。忘记提及了。OK。问题最终得到了解决。我发现提供数据的服务器间歇性地无法流,因为没有http错误,只是挂起在等待状态。有时速度很慢,而且有时无法验证。icktoofay的解决方案read/readline运行良好。我能够使用本文中提到的asyncproc模块解决另一个相关问题,尽管使用select不再读取块,但我需要读取应用程序吐出的确切字节,否则,我将不得不执行应用程序已经执行的数据包重新构造逻辑。为了避免这种情况,使用asyncproc会有所帮助。现在执行读取操作会一次返回另一个应用程序吐出的确切字节数(一个数据包长度)。很有意思。我将检查这个。Thx
import subprocess

class container(object):
    pass

self = container()
args = ['yes', 'test ' * 10]

self.p = subprocess.Popen(args, stdin=None, stderr=None,
                          stdout=subprocess.PIPE, shell=False)
while True:
    chunk = self.p.stdout.read(1024)
    print 'printing chunk'
    print chunk