Python调用外部系统命令

利用Python调用外部系统命令的方法可以提高编码效率。调用外部系统命令完成后可以通过获取命令执行返回结果码、执行的输出结果进行进一步的处理。本文主要描述Python常见的调用外部系统命令的方法,包括os.system()、os.popen()、subprocess.Popen()等。

1、subprocess模块

优先介绍subprocess模块的是由于该模块可以替代旧模块的方法,如os.system()、os.popen()等,推荐使用。subporcess模块可以调用外部系统命令来创建新子进程,同时可以连接到子进程的nput/output/error管道上,并得到子进程的返回值。subprocess模块主要有call()、check_call()、check_output()、Popen()函数,简要描述如下:

    Main API
    ========
    call(...): Runs a command, waits for it to complete, then returns the return code.
    check_call(...): Same as call() but raises CalledProcessError() if return code is not 0
    check_output(...): Same as check_call() but returns the contents of stdout instead of a return code
    Popen(...): A class for flexibly executing a command in a new process

下面开始介绍subprocess函数的使用方法。

  subprocess.Popen类

构造函数:subprocess.Popen(args, stdin=None, stdout=None, stderr=None, shell=False) #参数太多,仅列举关键参数

说明:

(1)args参数为要调用的外部系统命令。

(2)shell参数值为False时,Linux上通过调用os.execvp执行对应的程序。为Trule时,Linux上直接调用系统shell来执行程序。在Windows上,无论shell为False还是True,都是调用CreateProcess来执行执行指定外部程序。

(3)stdin、stdout、stdout分别用来指定子进程的标准输入、标准输出和标准错误。其值可以为PIPE、文件描述符和None等。默认值为None。

使用实例如下:

import subprocess

p = subprocess.Popen(args=‘ping -n 2 -w 3 192.168.1.104‘,stdin=subprocess.PIPE, stdout=subprocess.PIPE,stderr=subprocess.PIPE, shell=True)
p.wait()
print p.stdout.read()

说明:获取输出后,p.stdout(<open file ‘<fdopen>‘,mode ‘rb‘>)成为一个可读的文件对象,可以使用文件操作函数来读取。

subprocess.call()

  函数原型:call(*popenargs, **kwargs)。call()调用外部系统命令执行,并返回程序执行结果码。

import subprocess

retcode = subprocess.call(‘ping -n 2 -w 3 192.168.1.104‘, shell=True)
print retcode

subprocess.check_call()

使用方法同call()。如果调用命令执行成功,返回结果码0,如果执行失败,抛出CalledProcessError.异常。举例如下:

>>> p = subprocess.check_call(‘ping -n 2 -w 3 192.168.1.105‘, shell=True)

正在 Ping 192.168.1.105 具有 32 字节的数据:
请求超时。
请求超时。

192.168.1.105 的 Ping 统计信息:
    数据包: 已发送 = 2,已接收 = 0,丢失 = 2 (100% 丢失),
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "c:\Python27\lib\subprocess.py", line 186, in check_call
    raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command ‘ping -n 2 -w 3 192.168.1.105‘ returned non-zero exit status 1

 subprocess.check_output()

函数原型:check_output(*popenargs, **kwargs)。用法与call()相同。区别是如果执行成功返回的是标准输出内容。如果失败,抛CalledProcessError.异常。

import subprocess

output = subprocess.check_output(‘ping -n 2 -w 3 192.168.1.104‘, shell=True)
print output

2、os模块

os.system()

  os.system(command) 。调用外部系统命令,返回命令结果码,但是无法获取命令执行输出结果。

import os

retcode = os.system(‘ping -n 2 -w 3 192.168.1.104‘)
if retcode == 0:
    print "%s Success" % (ip,)
else:
    print "%s Fail" % (ip,)

os.popen()

os.popen(command) 。调用外部系统命令,返回命令执行输出结果,但不返回结果吗

import os

output = os.popen(‘ping -n 2 -w 3 192.168.1.104‘)
print output

3、commands模块

commands模块主要有如下3个函数

getoutput(cmd): Return output (stdout or stderr) of executing cmd in a shell.
getstatus(file):Return output of "ls -ld <file>" in a string.
getstatusoutput(cmd):Return (status, output) of executing cmd in a shell.

使用实例如下:

import commands

retcode, output = commands.getstatusoutput(‘ping -n 2 -w 3 192.168.1.104‘)
print retcode
print output

在windows上执行结果如下:

d:\temp>python test.py
1
‘{‘ 不是内部或外部命令,也不是可运行的程序
或批处理文件。

命令执行结果返回码一直为1,output变量值打印失败。commands库只能在Linux上使用?

原文地址:https://www.cnblogs.com/linyfeng/p/8973277.html

时间: 2024-11-12 11:13:22

Python调用外部系统命令的相关文章

21 python调用外部系统命令

1 Python中执行系统命令常见的几种方法 2 一,使用os模块 3 import os 4 1,os.system 5 6 import os 7 os.system('cat /proc/cupinfo') ## 类似于perl中的system命令,不能获取命令返回结果,只返回成功或失败 8 注意: 9 本质是调用标准C的system() 函数,仅仅在一个子终端运行系统命令, 10 ##不能获取命令执行后的返回信息. 11 12 2, os.popen ##相当于perl中的readpip

python调用外部子进程,通过管道实现异步标准输入和输出的交互

我们通常会遇到这样的需求:通过C++或其他较底层的语言实现了一个复杂的功能模块,需要搭建一个基于Web的Demo,方法查询数据.由于Python语言的强大和简洁,其用来搭建Demo非常合适,Flask框架和jinja2模块功能为python提供了方便的web开发能力.同时,python能够很方便的同其他语言的代码交互.因此我们选择python作为开发Demo的工具.假设我们需要调用的模块(提供底层服务)通过标准输入循环读入数据,处理完毕后把结果写出到标出输出,这样的场景在Linux环境下很常见,

Python 调用外部命令

python 可以使用 os 模块来调用外部的 Linux Shell 命令,常用的方法如下: (1) os.system():结果输出在终端上,捕获不到(2) os.popen() : 结果返回一个对象,即标准输出(3) os.popen2():结果返回两个对象,分别是标准输入,标准输出(4) os.popen3():结果返回三个对象,分别是标准输入,标准输出,标准错误输出(5) os.popen4():结果返回两个对象,分别是标准输入,标准输出(标准输出中包括标准错误输出) In [2]:

Python调用linux系统命令--使用subprocess模块

在python 中调用系统命令,如果使用subprocess.Popen() 模块,按照命令参数的的形式,可以分两种: 把命令当作字符串传给subprocess.Popen() 把命令保存到一个元组,list 的序列,再传给subprocess.Popen() subprocess模块使用Popen类创建子进程执行命令,首先subprocess.Popen() 的原型: subprocess.Popen(args, bufsize=0, executable=None, stdin=None,

python调用外部命令

os.system:  输出在终端上,捕捉不到 os.popen:  只能捕捉到标准输出,捕捉不到标准错误输出 os.popen2: 返回2个对象,一个是标准输入,一个是标准输出 os.popen3: 返回3个对象,标准输入,标准输出,标准错误输出 os.popen4: 返回2个对象,pip_in 和pip_out_err os.system:  输出在终端上,捕捉不到 In [4]: os.system('ls')                                        

python模拟鼠标键盘操作 GhostMouse tinytask 调用外部脚本或程序 autopy右键另存为

1.参考 autopy (实践见最后一章节) 用Python制作游戏外挂(上) AutoPy Introduction and Tutorial autopy.mouse.smooth_move(1, 1) 可以实现平滑移动 autopy - API Reference pip install PyUserInput SavinaRoja/PyUserInput [python3.5][PyUserInput]模拟鼠标和键盘模拟 Python-模拟鼠标键盘动作 autoit selenium借助

python调用系统命令popen、system

python调用Shell脚本,有两种方法:os.system(cmd)或os.popen(cmd),前者返回值是脚本的退出状态码,后者的返回值是脚本执行过程中的输出内容.所以说一般我们认为popen更加强大 os.system(cmd): 该方法在调用完shell脚本后,返回一个16位的二进制 数,低位为杀死所调用脚本的信号号码,高位为脚本的退出状态码,即脚本中“exit 1”的代码执行后,os.system函数返回值的高位数则是1,如果低位数是0的情况下,则函数的返回值是0×100,换算为1

python调用系统命令 shell命令

使用python调用系统命令,基本有3种选择: 1. 使用os模块的system方法 import os os.system('ls') 2. 使用os模块的popen方法 import os os.popen('ls') 3. 使用commands模块的getstatusoutput方法 import commands commands.getstatusoutput('ls') 以上3种方式都可以调用系统命令,但其中第三种方式,过程中如果系统命令报错,例如mkdir一个已存在的目录,其不会把

Perl调用外部命令(其他脚本、系统命令)的方法和区别

1. `command`; 使用反引号调用外部命令能够捕获其标准输出,并按行返回且每行结束处附带一个回车.反引号中的变量在编译时会被内插为其值. 2. open LIST "ls -l|";    open MORE "|more";    @list=<LIST>;    print MORE @list;    close(LIST);    close(MORE);使用带管道的文件句柄来执行外部命令,使用方式与读写文件类似.可以从外部命令的输出读取