• Python执行Linux系统命令的4种方法


    (1) os.system

    仅仅在一个子终端运行系统命令,而不能获取命令执行后的返回信息

    代码如下:
    system(command) -> exit_status
    Execute the command (a string) in a subshell.

    如果在命令行下执行,结果直接打印出来

    代码如下:
    >>>  os.system('ls')
    04101419778.CHM   bash      document    media      py-django   video
    11.wmv            books     downloads   Pictures  python
    all-20061022      Desktop   Examples    project    tools

    (2) os.popen

    该方法不但执行命令还返回执行后的信息对象

    代码如下:
     
    popen(command [, mode='r' [, bufsize]]) -> pipe
    Open a pipe to/from a command returning a file object.

    例如:

    代码如下:
    >>> tmp = os.popen('ls *.py').readlines()
    >>> tmp
    Out[21]: ['dump_db_pickle.py ',
    'dump_db_pickle_recs.py ',
    'dump_db_shelve.py ',
    'initdata.py ', '__init__.py ',
    'make_db_pickle.py ',
    'make_db_pickle_recs.py ',
    'make_db_shelve.py ',
    'peopleinteract_query.py ',
    'reader.py ', 'testargv.py ',
    'teststreams.py ',
    'update_db_pickle.py ',
    'writer.py ']

    好处在于:将返回的结果赋于一变量,便于程序的处理。

    (3)  使用模块 subprocess

    代码如下:
    >>>  import subprocess
    >>> subprocess.call(["cmd", "arg1", "arg2"],shell=True)

    获取返回和输出:

    代码如下:
    import subprocess
    p = subprocess.Popen('ls', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    for line in p.stdout.readlines():    
    print line,
    retval = p.wait()

    (4)  使用模块 commands

    代码如下:
    >>>  import commands
    >>> dir(commands) ['__all__', '__builtins__', '__doc__', '__file__', '__name__', 'getoutput', 'getstatus','getstatusoutput', 'mk2arg', 'mkarg']
    >>> commands.getoutput("date") 'Wed Jun 10 19:39:57 CST 2009'
    >>>
    >>> commands.getstatusoutput("date")
    (0, 'Wed Jun 10 19:40:41 CST 2009')

    注意: 当执行命令的参数或者返回中包含了中文文字,那么建议使用subprocess,如果使用os.popen则会出现下面的错误:

    代码如下:
    Traceback (most recent call last):  
    File "./test1.py", line 56, inmain()  
    File "./test1.py", line 45, in main   
      fax.sendFax()  
    File "./mailfax/Fax.py", line 13, in sendFax    
    os.popen(cmd)
    UnicodeEncodeError: 'ascii' codec can't encode characters in position 46-52: ordinal not inrange(128)
     
     
     
     
    os.system(command)

    这个函数可以调用 shell运行命令行command并且返回它的返回值。试一下在 python的解释器里输入os.system(”ls -l”),就可以看到”ls”列出了当前目录下的文件。可以说,通过这个函数,python就拥有了shell的所有能力。呵呵。。不过,通常这条命令不需要用到。因为shell常用的那些命令在python中通常有对应而且同样简洁的写法。

    shell中最常用的是ls命令,python对应的写法是:os.listdir(dirname),这个函数返回字符串列表,里面是所有的文件名,不过不包含”.”和”..”。如果要遍历整个目录的话就会比较复杂一点。我们等下再说吧。先在解释器里试一下:

    >>> os.listdir(”/”)

    [’tmp’, ‘misc’, ‘opt’, ‘root’, ‘.autorelabel’, ’sbin’, ’srv’, ‘.autofsck’, ‘mnt’, ‘usr’, ‘var’, ‘etc’, ’selinux’, ‘lib’, ‘net’, ‘lost found’, ’sys’, ‘media’, ‘dev’, ‘proc’, ‘boot’, ‘home’, ‘bin’]

    就像这样,接下去所有命令都可以在python的解释器里直接运行观看结果。

    对应于cp命令的是:shutil.copy(src,dest),这个函数有两个参数,参数src是指源文件的名字,参数dest则是目标文件或者目标目录的名字。 如果dest是一个目录名,就会在那个目录下创建一个相同名字的文件。与shutil.copy函数相类似的是 shutil.copy2(src,dest),不过copy2还会复制最后存取时间和最后更新时间。

    不过,shell的cp命令还可以复制目录,python的shutil.copy却不行,第一个参数只能是一个文件。这怎么办?其实,python还有个 shutil.copytree(src,dst[,symlinks]) 。参数多了一个symlinks,它是一个布尔值,如果是True的话就创建符号链接。

    移动或者重命名文件和目录呢?估计被聪明的朋友猜到了,shutil.move(src,dst),呵呵。。与mv命令类似,如果src和dst在同一个文件系统上,shutil.move只是简单改一下名字,如果src和dst在不同的文件系统上,shutil.move会先把src复制到dst,然后删除src文件。看到现在,大多数朋友应该已经对 python的能力有点眉目了,接下来我就列个表,介绍一下其它的函数:

    os.chdir(dirname)
    把当前工作目录切换到dirname下

    os.getcwd()
    返回当前的工作目录路径

    os.chroot(dirname)
    把dirname作为进程的根目录。和*nix下的chroot命令类似

    os.chmod(path,mode)
    更改path的权限位。mode可以是以下值(使用or)的组合:

    os.chown(path,uid,gid)
    改变文件的属主。uid和gid为-1的时候不改变原来的属主。

    os.link(src,dst)
    创建硬连接

    os.mkdir(path,[mode])
    创建目录。mode的意义参见os.chmod(),默认是0777

    os.makedirs(path,[mode])
    和os.mkdir()类似,不过会先创建不存在的父目录。

    os.readlink(path)
    返回path这个符号链接所指向的路径

    os.remove(path)
    删除文件,不能用于删除目录

    os.rmdir(path)
    删除文件夹,不能用于删除文件

    os.symlink(src,dst)
    创建符号链接

    shutil.rmtree(path[,ignore_errors[,onerror]])

    删除文件夹
    介绍了这么多,其实只要查一下os和shutil两个模块的文档就有了,呵呵。。真正编写 shell脚本的时候还需要注意:

    1.环境变量。python的环境变量保存在os.environ这个字典里,可以用普通字典的方法修改它,使用system启动其它程序的时候会自动被继承。比如:

    os.environ[”fish”]=”nothing”
    不过也要注意,环境变量的值只能是字符串。和shell有些不同的是,python没有 export环境变量这个概念。为什么没有呢?因为python没有必要有:-)

    2.os.path这个模块里包含了很多关于路径名处理的函数。在shell里路径名处理好像不是很重要,但是在python里经常需要用到。最常用的两个是分离和合并目录名和文件名:

    os.path.split(path) -> (dirname,basename)
    这个函数会把一个路径分离为两部分,比如:os.path.split(”/foo /bar.dat”)会返回(”/foo”,”bar.dat”)

    os.path.join(dirname,basename)
    这个函数会把目录名和文件名组合成一个完整的路径名,比如:os.path.join(”/foo”,”bar.dat”)会返回”/foo/bar.dat”。这个函数和os.path.split()刚好相反。

    4. 应用python编写shell脚本经常要用到os,shutil,glob(正则表达式的文件名),tempfile(临时文件),pwd(操作 /etc/passwd文件),grp(操作/etc/group文件),commands(取得一个命令的输出)。前面两个已经基本上介绍完了,后面几个很简单,看一下文档就可以了。

    5.sys.argv是一个列表,保存了python程序的命令行参数。其中 sys.argv[0]是程序本身的名字。
    不能光说不练,接下来我们就编写一个用于复制文件的简单脚本。前两天叫我写脚本的同事有个几万个文件的目录,他想复制这些文件到其它的目录,又不能直接复制目录本身。他试了一下”cp src/* dest/”结果报了一个命令行太长的错误,让我帮他写一个脚本。操起python来:
    import sys,os.path,shutil
    for f in os.listdir(sys.argv[1]):
        shutil.copy(os.path.join(sys.argv[1],f),sys.argv[2])
  • 相关阅读:
    Linux命令大全
    Restframework 视图组件与序列号组件的应用.
    Linux常用命令
    数据结构
    MongoDB
    算法
    Flask 语音分析
    Flask Session ,pymysql ,wtforms组件 虚拟virtualenv venv
    Flask 视图,模板,蓝图.
    Flask初识
  • 原文地址:https://www.cnblogs.com/pennyy/p/4248934.html
Copyright © 2020-2023  润新知