子进程

    很多时候,子进程并不是自身,而是一个外部进程。我们创建了子进程后,还需要控制子进程的输入和输出。

    subprocess 模块可以让我们非常方便地启动一个子进程,然后控制其输入和输出。

    下面的例子演示了如何在Python代码中运行命令 nslookup www.python.org ,这和命令行直接运行的效果是一样的:

    import subprocess



    print('$ nslookup www.python.org')

    r = subprocess.call(['nslookup', 'www.python.org'])

    print('Exit code:', r)

    运行结果:

    $ nslookup www.python.org

    Server: 192.168.19.4

    Address: 192.168.19.4#53



    Non-authoritative answer:

    www.python.org canonical name = python.map.fastly.net.

    Name: python.map.fastly.net

    Address: 199.27.79.223



    Exit code: 0

    如果子进程还需要输入,则可以通过 communicate() 方法输入:

    import subprocess



    print('$ nslookup')

    p = subprocess.Popen(['nslookup'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

    output, err = p.communicate(b'set q=mx\npython.org\nexit\n')

    print(output.decode('utf-8'))

    print('Exit code:', p.returncode)

    上面的代码相当于在命令行执行命令 nslookup ,然后手动输入:

    set q=mx

    python.org

    exit

    运行结果如下:

    $ nslookup

    Server: 192.168.19.4

    Address: 192.168.19.4#53



    Non-authoritative answer:

    python.org mail exchanger = 50 mail.python.org.



    Authoritative answers can be found from:

    mail.python.org internet address = 82.94.164.166

    mail.python.org has AAAA address 2001:888:2000:d::a6



    Exit code: 0