在ping python上的服务器时,为什么子进程不返回任何内容? - python

我正在使用子过程来ping服务器,但是我想收到完整的响应。过去,我曾使用os来ping,但这只返回了10

我正在使用的代码是:

import subprocess
p = subprocess.Popen(['ping', '8.8.8.8'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = p.communicate()
print out

我想知道是否可以从终端运行该响应。请注意,我使用的是-c而不是-n,因为我使用linux作为操作系统。

我对为什么这行不通感到困惑,因为当我运行类似的代码时,它打印出了预期的响应:

import subprocess
p = subprocess.Popen(['ls', '-a'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = p.communicate()
print out

上面的代码打印出了保存python脚本的目录中文件和文件夹的列表,因此我使用的代码似乎是正确的。

我的问题是,如何对分配给变量的服务器执行ping操作,然后运行ls时就可以打印出来,从而得到响应。

python大神给出的解决方案

默认的ping是一个连续的过程。直到您中断它,它才会停止,例如使用ctrl-C。当然,对于subprocess,ctrl-C是不可能的。

subprocess.communicate将所有输出缓冲在内存中,直到程序结束(即从不);实际上,您可以使用它来创建内存不足错误;-)。

如果您只喜欢几次ping或什至1次ping,请在-c中使用ping选项:

p = subprocess.Popen(['ping', '-c1', '8.8.8.8'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)

如果您想要连续轮询,可以将其包装在Python内部的while循环中。