zoukankan      html  css  js  c++  java
  • python os.system()和os.popen()

    1》python调用Shell脚本,有两种方法:os.system()和os.popen(),
    前者返回值是脚本的退出状态码,后者的返回值是脚本执行过程中的输出内容。
    >>>help(os.system)
    Help on built-in function system in module posix:
    system(...)
        system(command) -> exit_status
        Execute the command (a string) in a subshell.
    >>> help(os.popen)
    Help on built-in function popen in module posix:
    popen(...)
        popen(command [, mode='r' [, bufsize]]) -> pipe
        Open a pipe to/from a command returning a file object.
    2》假定有一个shell脚本test.sh:
    song@ubuntu:~$ vi test.sh
    song@ubuntu:~$ more test.sh
    #!/bin/bash
    echo 'hello python!'
    echo 'hello world!'
    exit 1
    song@ubuntu:~$
    2.1》os.system(command):该方法在调用完shell脚本后,返回一个16位的二进制数,
    低位为杀死所调用脚本的信号号码,高位为脚本的退出状态码,
    即脚本中“exit 1”的代码执行后,os.system函数返回值的高位数则是1,如果低位数是0的情况下,
    则函数的返回值是0x0100,换算为十进制得到256。
    要获得os.system的正确返回值,可以使用位移运算(将返回值右移8位)还原返回值:
    >>> import os
    >>> os.system("./test.sh")
    hello python!
    hello world!
    256
    >>> n=os.system("./test.sh")
    hello python!
    hello world!
    >>> n
    256
    >>> n>>8
    1
    >>>
    2.2》os.popen(command):这种调用方式是通过管道的方式来实现,函数返回一个file对象,
    里面的内容是脚本输出的内容(可简单理解为echo输出的内容),使用os.popen调用test.sh的情况:
    >> import os
    >>> os.popen("./test.sh")
    <open file './test.sh', mode 'r' at 0x7f6cbbbee4b0>
    >>> f=os.popen("./test.sh")
    >>> f
    <open file './test.sh', mode 'r' at 0x7f6cbbbee540>
    >>> f.readlines()
    ['hello python! ', 'hello world! ']
    >>>
    3》像调用”ls”这样的shell命令,应该使用popen的方法来获得内容,对比如下:
    >>> import os
    >>> os.system("ls")   #直接看到运行结果
    Desktop    Downloads     Music     Public     Templates  Videos
    Documents  examples.desktop  Pictures  systemExit.py  test.sh
    0    #返回值为0,表示命令执行成功
    >>> n=os.system('ls')
    Desktop    Downloads     Music     Public     Templates  Videos
    Documents  examples.desktop  Pictures  systemExit.py  test.sh
    >>> n
    0
    >>> n>>8   #将返回值右移8位,得到正确的返回值
    0
    >>> f=os.popen('ls') #返回一个file对象,可以对这个文件对象进行相关的操作
    >>> f
    <open file 'ls', mode 'r' at 0x7f5303d124b0>
    >>> f.readlines()
    ['Desktop ', 'Documents ', 'Downloads ', 'examples.desktop ', 'Music ', 'Pictures ', 'Public ', 'systemExit.py ', 'Templates ', 'test.sh ', 'Videos ']
    >>>
    总结:os.popen()可以实现一个“管道”,从这个命令获取的值可以继续被使用。因为它返回一个文件对象,可以对这个文件对象进行相关的操作。

    但是如果要直接看到运行结果的话,那就应该使用os.system,用了以后,立竿见影!

  • 相关阅读:
    Harbor
    Ansible自动化部署详细教程
    企业级-Shell案例18——目录入侵检测与告警
    企业级-Shell案例17——DOS攻击防范(自动屏蔽攻击IP)
    企业级-Shell案例16——自动发布PHP项目
    springboot启动报错,Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
    IO流05--毕向东JAVA基础教程视频学习笔记
    IO流04--毕向东JAVA基础教程视频学习笔记
    IO流03--毕向东JAVA基础教程视频学习笔记
    IO流02--毕向东JAVA基础教程视频学习笔记
  • 原文地址:https://www.cnblogs.com/hdk1993/p/8428720.html
Copyright © 2011-2022 走看看