zoukankan      html  css  js  c++  java
  • python 调用shell命令三种方法

    #!/usr/bin/python是告诉操作系统执行这个脚本的时候,调用/usr/bin下的python解释器;
    #!/usr/bin/env python这种用法是为了防止操作系统用户没有将python装在默认的/usr/bin路径里。

    python调用shell命令的方法有许多

    1.1   os.system(command)
           在一个子shell中运行command命令,并返回command命令执行完毕后的退出状态。这实际上是使用C标准库函数system()实现的。这个函数在执行command命令时需要重新打开一个终端,并且无法保存command命令的执行结果。
    1.2   os.popen(command,mode)
          打开一个与command进程之间的管道。这个函数的返回值是一个文件对象,可以读或者写(由mode决定,mode默认是’r')。如果mode为’r',可以使用此函数的返回值调用read()来获取command命令的执行结果。
    1.3   commands.getstatusoutput(command)
      使用os.popen()函数执行command命令并返回一个元组(status,output),分别表示command命令执行的返回状态和执行结果。对command的执行实际上是按照{command;} 2>&1的方式,所以output中包含控制台输出信息或者错误信息。output中不包含尾部的换行符。
     
    2.1   subprocess.call(["some_command","some_argument","another_argument_or_path"])
            subprocess.call(command,shell=True)
    2.2   subprocess.Popen(command, shell=True)
           如果command不是一个可执行文件,shell=True不可省。
           使用subprocess模块可以创建新的进程,可以与新建进程的输入/输出/错误管道连通,并可以获得新建进程执行的返回状态。使用subprocess模块的目的是替代os.system()、os.popen*()、commands.*等旧的函数或模块。
      最简单的方法是使用class subprocess.Popen(command,shell=True)。Popen类有Popen.stdin,Popen.stdout,Popen.stderr三个有用的属性,可以实现与子进程的通信。
    将调用shell的结果赋值给python变量
    handle = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE)
    print handle.communicate()[0]
    2.3 用 commands 模块。其实也是对popen的封装。此模块主要有如下方法
    commands.getstatusoutput(cmd) 返回(status, output).
    commands.getoutput(cmd) 只返回输出结果
    commands.getstatus(file) 返回ls -ld file的执行结果字符串,调用了getoutput,不建议使用此方法.
    >>> import commands
    >>> commands.getstatusoutput('ls /bin/ls')
    (0, '/bin/ls')
    >>> commands.getstatusoutput('cat /bin/junk')
    (256, 'cat: /bin/junk: No such file or directory')
    >>> commands.getstatusoutput('/bin/junk')
    (256, 'sh: /bin/junk: not found')
    >>> commands.getoutput('ls /bin/ls')
    '/bin/ls'
    >>> commands.getstatus('/bin/ls')
    '-rwxr-xr-x  1 root        13352 Oct 14  1994 /bin/ls'
     
     
     
     
     
    在Python/wxPython环境下,执行外部命令或者说在Python程序中启动另一个程序的方法一般有这么几个:
    1、os.system(command)
    2、wx.Execute(command, syn=wx.EXEC_ASYNC, callback=None)
         若置syn为wx.EXEC_ASYNC则wx.Excute函数立即返回,若syn=wx.EXEC_SYNC则等待调用的程序结束后再返回。
         callback是一个wx.Process变量,如果callback不为None且syn=wx.EXEC_ASYNC,则程序结束后将调用wx.Process.OnTerminate()函数。
    os.system()和wx.Execute()都利用系统的shell,执行时会出现shell窗口。如在Windows下会弹出控制台窗口,不美观。下面的两种方法则没有这个缺点。
    3、class subprocess.Popen
         最简单的用法是:
         import subprocess
         subprocess.Popen(command, shell=True)
         如果command不是一个可执行文件,shell=True不可省。
    前面三个方法只能用于执行程序和打开文件,不能处理URL,打开URL地址可用webbrowser模块提供的功能。
    4、webbrowser.open(url)
         调用系统缺省浏览器打开URL地址,如 webbrowser.open('http://www.google.com'),也可以利用
         webbrowser.open('h:python.zip')来执行程序。这样可以不必区分是文件名还是URL,不知道在Linux下是否可行。
    以上在Windows2000,Python2.4a1,wxPython 2.5.1运行。
    modify:还有一种方式:subprocess.call(*args, **kwargs)
     
  • 相关阅读:
    小结
    day17——其他内置函数
    day16——函数式编程和内置函数
    Python中的函数
    Python字符串的两种方式——百分号方式,format的方式
    第一章 初识Mysql
    day13 Python数据基本类型
    day14 集合与函数
    第七章 线性回归预测模型
    json-lib(ezmorph)、gson、flexJson、fastjson、jackson对比,实现java转json,json转java
  • 原文地址:https://www.cnblogs.com/timssd/p/5332500.html
Copyright © 2011-2022 走看看