视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
python中subprocess批量执行linux命令
2020-11-27 14:21:52 责编:小采
文档


本篇文章给大家详细讲述了python中使用subprocess批量执行linux命令的方法,有兴趣的朋友参考学习下。

可以执行shell命令的相关模块和函数有:

  • os.system

  • os.spawn

  • os.popen --废弃

  • popen --废弃

  • commands --废弃,3.x中被移除

  • 以上执行shell命令的相关的模块和函数的功能均在 subprocess 模块中实现,并提供了更丰富的功能。

    subprocess

    call

    执行命令,返回状态码

    >>> import subprocess
    >>> ret = subprocess.call(["ls", "-l"], shell=False)
    total 4684
    -rw-r--r-- 1 root root 454 May 5 12:20 aa.py
    -rw-r--r-- 1 root root 0 May 8 16:51 aa.txt
    -rw-r--r-- 1 root root 4783286 Apr 11 16:39 DockerToolbox.exe
    -rw-r--r-- 1 root root 422 May 5 12:20 ip_info.txt
    -rw-r--r-- 1 root root 718 Apr 19 10:52 my.cnf
    >>> ret = subprocess.call("ls -l", shell=True)
    total 4684
    -rw-r--r-- 1 root root 454 May 5 12:20 aa.py
    -rw-r--r-- 1 root root 0 May 8 16:51 aa.txt
    -rw-r--r-- 1 root root 4783286 Apr 11 16:39 DockerToolbox.exe
    -rw-r--r-- 1 root root 422 May 5 12:20 ip_info.txt
    -rw-r--r-- 1 root root 718 Apr 19 10:52 my.cnf
    >>> print(ret)
    0

    check_call

    执行命令,如果执行状态码是 0 ,则返回0,否则抛异常

    >>> subprocess.check_call(["ls", "-l"])
    total 4684
    -rw-r--r-- 1 root root 454 May 5 12:20 aa.py
    -rw-r--r-- 1 root root 0 May 8 16:51 aa.txt
    -rw-r--r-- 1 root root 4783286 Apr 11 16:39 DockerToolbox.exe
    -rw-r--r-- 1 root root 422 May 5 12:20 ip_info.txt
    -rw-r--r-- 1 root root 718 Apr 19 10:52 my.cnf
    0
    >>> subprocess.check_call("exit 1", shell=True)
    Traceback (most recent call last):
     File "<stdin>", line 1, in <module>
     File "/usr/local/python3.5/lib/python3.5/subprocess.py", line 581, in check_call
     raise CalledProcessError(retcode, cmd)
    subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1

    check_output

    执行命令,如果状态码是 0 ,则返回执行结果,否则抛异常

    >>> subprocess.check_output(["echo", "Hello World!"])
    b'Hello World!
    '
    >>> subprocess.check_output("exit 1", shell=True)
    Traceback (most recent call last):
     File "<stdin>", line 1, in <module>
     File "/usr/local/python3.5/lib/python3.5/subprocess.py", line 626, in check_output
     **kwargs).stdout
     File "/usr/local/python3.5/lib/python3.5/subprocess.py", line 708, in run
     output=stdout, stderr=stderr)
    subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1

    subprocess.Popen(...)

    用于执行复杂的系统命令

    参数:

    args:shell命令,可以是字符串或者序列类型(如:list,元组)

    bufsize:指定缓冲。0 无缓冲,1 行缓冲,其他 缓冲区大小,负值 系统缓冲

    stdin, stdout, stderr:分别表示程序的标准输入、输出、错误句柄

    preexec_fn:只在Unix平台下有效,用于指定一个可执行对象(callable object),它将在子进程运行之前被调用

    close_sfs:在windows平台下,如果close_fds被设置为True,则新创建的子进程将不会继承父进程的输入、输出、错误管道。

    所以不能将close_fds设置为True同时重定向子进程的标准输入、输出与错误(stdin, stdout, stderr)。

    shell:同上

    cwd:用于设置子进程的当前目录

    env:用于指定子进程的环境变量。如果env = None,子进程的环境变量将从父进程中继承。

    universal_newlines:不同系统的换行符不同,True -> 同意使用 n

    startupinfo与createionflags只在windows下有效

    将被传递给底层的CreateProcess()函数,用于设置子进程的一些属性,如:主窗口的外观,进程的优先级等等

    执行普通命令

    >>> import subprocess
    >>> ret1 = subprocess.Popen(["mkdir","t1"])
    >>> ret2 = subprocess.Popen("mkdir t2", shell=True)
    >>> print(ret1)
    <subprocess.Popen object at 0x7f4d7609dd30>
    >>> print(ret2)
    <subprocess.Popen object at 0x7f4d7609dc18>

    终端输入的命令分为两种:

  • 输入即可得到输出,如:ifconfig

  • 输入进行某环境,依赖再输入,如:python

  • >>> import subprocess
    >>> obj = subprocess.Popen("mkdir t3", shell=True, cwd='/tmp/',)
    >>> import subprocess
    >>> obj = subprocess.Popen(["python"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
    >>> obj.stdin.write("print(1)
    ")
    9
    >>> obj.stdin.write("print(2)")
    8
    >>> obj.stdin.close()
    >>> cmd_out = obj.stdout.read()
    >>> obj.stdout.close()
    >>> cmd_error = obj.stderr.read()
    >>> obj.stderr.close()
    >>> print(cmd_out)
    1
    2
    >>> print(cmd_error)
    >>> import subprocess
    >>> 
    >>> obj = subprocess.Popen(["python"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
    >>> obj.stdin.write("print(1)
    ")
    9
    >>> obj.stdin.write("print(2)")
    8
    >>> 
    >>> out_error_list = obj.communicate()
    >>> print(out_error_list)
    ('1
    2
    ', '')
    >>> obj = subprocess.Popen(["python"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
    >>> out_error_list = obj.communicate('print("hello")')
    >>> print(out_error_list)
    ('hello
    ', '')

    下载本文
    显示全文
    专题