【Python】subprocess – 子进程管理

  • Post author:
  • Post category:python



目录


一. 介绍


二. 说明


三. 实例


四. 参考


一. 介绍



subprocess


模块允许你生成新的进程,连接它们的输入、输出、错误管道,并且获取它们的返回码。

描述了一个用于启动进程并与进程进行通信的新模块。

二. 说明


在任何编程语言中,启动新流程都是常见的任务,而在高级语言(如Python)中则很常见。需要对此任务提供良好的支持,因为:

  • 不适当的函数来启动进程可能意味着安全风险:如果程序是通过Shell启动的,并且参数包含Shell元字符,则结果可能是灾难性的。

    [1]
  • 它使Python成为过度复杂的Shell脚本的更好的替代语言。


当前,Python具有大量用于进程创建的不同功能。这使开发人员难以选择。

定义:

class Popen(args, bufsize=0, executable=None,
            stdin=None, stdout=None, stderr=None,
            preexec_fn=None, close_fds=False, shell=False,
            cwd=None, env=None, universal_newlines=False,
            startupinfo=None, creationflags=0):

三. 实例

# -- coding:utf-8 --

import os
import subprocess


def test_popen(cmds):
    p = subprocess.Popen(cmds[0], stdout=subprocess.PIPE, shell=True)
    print 'the current sub process pid(cwd: %s, ppid: %s, id: %s%d).' % (
        p.pid, os.getppid(), type(p), id(p))
    processes = [p]
    for x in cmds[1:]:
        p = subprocess.Popen(x,
                             stdin=p.stdout,
                             stdout=subprocess.PIPE,
                             shell=True)
        print 'the current sub process pid(cwd: %s, ppid: %s, id: %s%d).' % (
            p.pid, os.getppid(), type(p), id(p))
        # print type(p), id(p)
        processes.append(p)
    print 'the current run process pid(cwd: %s, ppid: %s, id: %s%d).' % (
        p.pid, os.getppid(), type(p), id(p))
    print type(p), id(p)
    output = p.communicate()[0]
    # for p in processes:
    #     print 'the current wait pid(%s).' % p.pid
    #     p.wait()

    # print 'the current run process pid(cwd: %s, ppid: %s).' % (p.pid,
    #                                                            os.getppid())
    content = output.rstrip('\n')
    print 'the current run process pid(cwd: %s, ppid: %s, id: %s%d).' % (
        p.pid, os.getppid(), type(p), id(p))
    return content


if __name__ == "__main__":
    '''主函数入口'''
    print
    print 'the current run main process is (cwd: %s, ppid: %s).' % (
        os.getpid(), os.getppid())
    # git config --local --list | grep "user"
    # cmds = ["git config --local --list", "grep \"user\""]
    cmds = ["git config --local --list", "grep \"user\"", "grep \"@\""]
    result = test_popen(cmds)
    print 'the current run main process is (cwd: %s, ppid: %s).' % (
        os.getpid(), os.getppid())
    print 'the content is %s' % result

四. 参考


  1. https://www.python.org/dev/peps/

  2. https://www.python.org/dev/peps/pep-0324/

  3. https://docs.python.org/zh-cn/2.7/library/subprocess.html

  4. https://docs.python.org/zh-cn/3/library/subprocess.html

  5. https://stackoverflow.com/questions/89228/how-to-call-an-external-command

(完)



版权声明:本文为DovSnier原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。