Python 使用 subprocess 调用外部命令
2014-05-04 16:10
369 查看
从 Python 2.4 开始,Python 引入 subprocess 模块来管理子进程,以取代一些旧模块的方法:如os.system、os.spawn、os.popen、popen2.*、commands.*。subprocess 不但可以调用外部的命令作为子进程,而且可以连接到子进程的 input/output/error 管道,获取相关的返回信息。
使用 Popen 类
args 参数,指定要执行的外部程序。其值可以是字符串或者序列。
shell 默认为 False。
在 Unix 下,shell=False 时, Popen 调用 os.execvp() 执行 args
指定的程序;shell=True 时,如果 args 是字符串,Popen 直接调用系统的 Shell 来执行 args 指定的程序,如果
args 是一个序列,则 args 的第一项是定义程序命令字符串,其它项是调用系统 Shell 时的附加参数。
在 Windows 下,不论 shell 的值如何,Popen 调用 CreateProcess() 执行 args
指定的外部程序。如果 args 是一个序列,则先用 list2cmdline() 转化为字符串,但需要注意的是,并不是 MS Windows
下所有的程序都可以用 list2cmdline 来转化为命令行字符串。
stdin、stdout、stderr 分别用于指定程序标准输入、输出、错误的 handle。其值可以为 PIPE、file descriptor、文件对象、None。
以调用 Linux 下的 ping 命令为例:
如果要取得 ping 的输出信息:
外部程序是在一个子进程里执行的,如果要等待该进程的结束,可以使用 wait():
wait() 方法会返回一个返回代码。
又或者在创建 Popen 对象后调用 communicate() :
communicate() 返回一个 (stdout, sterr)。
subprocess 模块里面有两个方便的函数 call() 和 check_all(),可以直接调用来执行外部程序。
它们的参数列表跟 Popen 的构造函数参数列表一样。返回一个 returncode。例如:
http://www.python.org/doc/2.5.2/lib/module-subprocess.html
使用 subprocess 模块
使用 Popen 类class 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)
args 参数,指定要执行的外部程序。其值可以是字符串或者序列。
shell 默认为 False。
在 Unix 下,shell=False 时, Popen 调用 os.execvp() 执行 args
指定的程序;shell=True 时,如果 args 是字符串,Popen 直接调用系统的 Shell 来执行 args 指定的程序,如果
args 是一个序列,则 args 的第一项是定义程序命令字符串,其它项是调用系统 Shell 时的附加参数。
在 Windows 下,不论 shell 的值如何,Popen 调用 CreateProcess() 执行 args
指定的外部程序。如果 args 是一个序列,则先用 list2cmdline() 转化为字符串,但需要注意的是,并不是 MS Windows
下所有的程序都可以用 list2cmdline 来转化为命令行字符串。
stdin、stdout、stderr 分别用于指定程序标准输入、输出、错误的 handle。其值可以为 PIPE、file descriptor、文件对象、None。
以调用 Linux 下的 ping 命令为例:
pingPopen = subprocess.Popen(args='ping -c4 www.google.cn', shell=True)
如果要取得 ping 的输出信息:
pingPopen = subprocess.Popen(args='ping -c4 www.google.cn', shell=True, stdout=subprocess.PIPE) print pingPopen.stdout.read()
外部程序是在一个子进程里执行的,如果要等待该进程的结束,可以使用 wait():
pingPopen.wait()
wait() 方法会返回一个返回代码。
又或者在创建 Popen 对象后调用 communicate() :
stdReturn = subprocess.Popen(args='ping -c4 www.google.cn', shell=True, stdout=subprocess.PIPE,stderr=subprocess.PIPE).communicate()
communicate() 返回一个 (stdout, sterr)。
使用 call() 和 check_all()
subprocess 模块里面有两个方便的函数 call() 和 check_all(),可以直接调用来执行外部程序。call(*popenargs, **kwargs)
check_call(*popenargs, **kwargs)
它们的参数列表跟 Popen 的构造函数参数列表一样。返回一个 returncode。例如:
subprocess.call('ping -c4 www.google.cn',shel=True)
#!/usr/bin/env python import subprocess #print 'popen3:' def external_cmd(cmd, msg_in=''): try: proc = subprocess.Popen(cmd, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, ) stdout_value, stderr_value = proc.communicate(msg_in) return stdout_value, stderr_value except ValueError as err: # log("ValueError: %s" % err) return None, None except IOError as err: # log("IOError: %s" % err) return None, None if __name__ == '__main__': stdout_val, stderr_val = external_cmd('ls -l') print 'Standard Output: %s' % stdout_val print 'Standard Error: %s' % stderr_val
参考资料
http://www.python.org/doc/2.5.2/lib/module-subprocess.html
相关文章推荐
- Python 使用 subprocess 调用外部命令
- [python]subprocess调用外部命令屏蔽输出
- python中使用subprocess调用外部程序
- Python使用subprocess的Popen要调用系统命令
- python中使用subprocess调用外部程序
- Python:使用ctypes库调用外部DLL
- Python用subprocess的Popen来调用系统命令
- 使用C#调用外部Ping命令获取网络连接情况
- 使用C#调用外部Ping命令获取网络连接情况[转载CSDN]
- Python用subprocess的Popen来调用系统命令
- Python用subprocess的Popen来调用系统命令
- 使用C#调用外部Ping命令获取网络连接情况
- 使用C#调用外部Ping命令获取网络连接情况
- Python用subprocess的Popen来调用系统命令
- Python用subprocess的Popen来调用系统命令
- python模块:调用系统命令模块subprocess等
- Python用subprocess的Popen来调用系统命令
- 使用C#调用外部Ping命令获取网络连接情况
- 使用C#调用外部Ping命令获取网络连接情况
- python可以调用外部系统命令