分类: Python/Ruby
2010-10-30 00:06:55
在收集snmp数据的过程中用到了subprocess这个模块,本来想用其他python里面关于snmp的库,还是觉得麻烦就直接调用snmpwalk来收集数据。 最开始想用subprocess.call()这个函数,然而这个函数没有和其他进程通信的功能就放弃了 google了一下找到subprocess.Popen()这个函数,具体用法后面会贴一个别人写的帖子 其中subprocess.PIPE类似于pipe()系统调用,不过不需要指定PID,只需要把stdout,stdin,error指定为subprocess.PIPE就可以了 我写的这个小脚本里面有参数shell=True,意思是通过shell执行命令而不是直接的execvp() #!/usr/bin/env python # gathering snmp data import subprocess import os cmd="snmpwalk -v 2c ip -c group" fd=open("/home/user/snmptest","w") data=subprocess.Popen(cmd,stdout=subprocess.PIPE,shell=True) fd.write(data.stdout.read()) fd.close() 执行之后snmptest里面就写入了收集来的snmp数据 另外贴一个别人总结的subprocess的使用方法 Python模块学习 ---- subprocess 创建子进程 最近,我们老大要我写一个 守护者程序,对服务器进程进行守护。如果服务器不幸挂掉了,守护者能即时的重启应用程序。上网Google了一下,发现Python有很几个模块都可以创 建进程。最终我选择使用subprocess模块,因为在Python手册中有这样一段话: This module intends to replace several other, older modules and functions, such as: os.system、os.spawn*、os.popen*、popen2.*、commands.* subprocess被用来替换一些老的模块和函数,如:os.system、 os.spawn*、os.popen*、popen2.*、commands.*。可见,subprocess是被推荐使用的模块。 下面是一个很简单的例子,创建一个新进程,执行app1.exe,传入相当的参数,并打印出进 程的返回值:
returnCode = subprocess.call('app1.exe -a -b -c -d') #----- 结果 -------- app1.exe是一个非常简单的控制台程序,它只打印出传入的参数,代码如下:
int main(int argc, const char *argv[]) return 0; 闲话少说,下面开始详细介绍subprocess模块。subprocess模块中只定义 了一个类: Popen。可以使用Popen来创建进程,并与进程进行复杂的交互。它的构造函数如下: subprocess.Popen(args, bufsize=0, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=False, shell=False, cwd=None, env=None, universal_newlines=False, startupinfo=None, creationflags=0) subprocess.PIPE subprocess.STDOUT Popen的方法: Popen.poll() Popen.wait() Popen.communicate(input=None) Popen.send_signal(signal) Popen.terminate() Popen.kill() Popen.stdin Popen.stdout Popen.stderr Popen.pid Popen.returncode 下面是一个非常简单的例子,来演示supprocess模块如何与一个控件台应用程序进行交 互。 import subprocess app2.exe也是一个非常简单的控制台程序,它从界面上接收两个数值,执行加操作,并将结 果打印到控制台上。代码如下: #include supprocess模块提供了一些函数,方便我们用于创建进程。 subprocess.call(*popenargs, **kwargs) subprocess.check_call(*popenargs, **kwargs) subprocess模块的内容就这么多。在Python手册中,还介绍了如何使用 subprocess来替换一些老的模块,老的函数的例子。赶兴趣的朋友可以看一下。 参考文档: subprocess — Subprocess management PyMoTW:subprocess 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/JGood/archive/2009/08/29/4498166.aspx |