• Run Shell Commands in Python


    subprocess.call

    This is the recommended way to run shell commands in Python compared with old-fashioned os module. This is a "real-time" method, which means you can get the shell output on the fly, compared with following "subprocess.check_output" method, which collect all output in its return value. This method return the return value of the command, for example:

    ret = subprocess.call('ls -l')
    

    where ret=0, while

    ret = subprocess.call('cd aaa')
    

    ret=2 when there isn't "aaa" subfolder under CWD.

    For ease of use, write a shorthand function:

    import subprocess
    def run(cmd):
        ret = subprocess.call(cmd, shell=True)
        if ret != 0:
            sys.exit('Exec cmd %s error, return value: %s' %(cmd, str(ret)))
    

    Then you can simply use "run(cmd)" as a shell interface. "run" print command stdout stderr to console stdout, and if there's something wrong during execution, we interrupt it.

    subprocess.check_output

    A more safe way to run shell command is using "check_output" function. If the return value if not 0, a exception raised, otherwise return the command output.

    $ cat myrun.py
    import subprocess
    def run(cmd):
        return subprocess.check_output(cmd, shell=True)
    $ python -i myrun.py
    >>> ret = run('ls -l|grep donno')
    >>> ret
    'drwxr-xr-x 6 chad chad 4096 Jan 26 18:18 donno-0.1.10
    -rw-r--r-- 1 chad chad 8716 Jan 27 15:53 donno-0.1.10.tar.gz
    '
    >>> ret = run('cd aaa')
    /bin/sh: 1: cd: can't cd to aaa
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "shtest.py", line 3, in run
        return subprocess.check_output(cmd, shell=True)
      File "/usr/lib/python2.7/subprocess.py", line 544, in check_output
        raise CalledProcessError(retcode, cmd, output=output)
    subprocess.CalledProcessError: Command 'cd aaa' returned non-zero exit status 2
    

    os.system

    If it's unnecessary to save command output, this is most convenient way. The output will output to console. You can use space and pipe in command:

    >>> import os 
    >>> ret = os.system('ls -l|grep D')
    

    And it will return after the command complete:

    >>> ret = os.system('vmstat 3 3')
    

    os.popen

    Use this form if you want to save command output.

    >>> retfile = os.popen('pwd')
    >>> ret = retfile.read() 
    >>> ret 
    '/home/lichao
    ' 
    >>> retfile 
    <open file 'pwd', mode 'r' at 0xb74aad30>
    

    or write it more compact:

    >>> result = os.popen('ls|grep enex').read()
    

    subprocess.Popen

    If you want some more powerful tools, use this. You can't use pipe directly in this form. Instead, You have to use subprocess.PIPE:

    >>> import subprocess
    >>> lsres = subprocess.Popen(['ls','-l'], stdout=subprocess.PIPE)
    >>> grepres = subprocess.Popen(['grep', 'Do'], stdin=lsres.stdout, stdout=subprocess.PIPE)
    >>> res = grepres.communicate()
    

    communicate() interact with process: Send data to stdin. Read data from stdout and stderr, until end-of-file is reached. Wait for process to terminate. It returns a tuple (stdoutdata, stderrdata).

    Deprecated

    • commands.getoutput()

    • commands.getstatusoutput()

  • 相关阅读:
    (已解决)mac安装mysql出现:ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/my...
    非root用户启动redis容器报错mkdir: cannot create directory '/bitnami/redis': Permission denied
    VirtualBox虚拟机E_INVALIDARG (0x80070057)
    非root用户启动redis容器报错mkdir: cannot create directory '/bitnami/redis': Permission denied
    添加共享文件夹
    Skipping acquire of configured file ···doesn't support architecture 'i386' acquire of configured file
    docker镜像运行错误排查
    debian9使用国内源安装docker以及一些使用方法
    docker创建镜像及push镜像出错问题
    mongodb参数
  • 原文地址:https://www.cnblogs.com/darkmatter/p/3605593.html
Copyright © 2020-2023  润新知