Python中的子进程简介与实例

361 阅读5分钟

Python中的子进程简介及示例

An Introduction to Subprocess in Python [ Examples Included]

目录

Python中的子进程是一个模块,用于通过创建新的进程来运行新的代码和应用程序。它可以让你从当前正在编写的Python程序中直接启动新的应用程序。因此,如果你想运行来自git仓库的外部程序或来自C或C++程序的代码,你可以使用Python中的subprocess。你还可以使用Python中的subprocess获得退出代码和输入、输出或错误管道。

如何在Python中启动一个进程?

要启动一个新的进程,或者换句话说,在Python中启动一个新的子进程,你需要使用Popen函数调用。在函数调用中可以传递两个参数。第一个参数是你要启动的程序,第二个是文件参数。在下面的例子中,你将使用Unix的cat命令和example.py作为两个参数。cat命令是 "concatenate "的简称,在Linux和Unix编程中被广泛使用。它就像 "cat example.py"。你可以启动任何程序,除非你没有创建它。

from subprocess import Popen, PIPE

process = Popen(\['cat', 'example.py'\], stdout=PIPE, stderr=PIPE)

stdout, stderr = process.communicate()

print(stdout)

输出:

SubprocessInPython_1

在上面的代码中,process.communicate()是主要的调用,它读取了进程的所有输入和输出。stdout "处理进程的输出,而 "stderr "用于处理任何类型的错误,只有在发生任何此类错误时才会写入。

什么是子进程调用()?

Python中的子进程有一个call()方法,用于启动一个程序。这个子进程调用()方法的语法是:

subprocess.check\_call(args, \*, stdin=None, stdout=None, stderr=None, shell=False)

子进程调用()的参数

Python中子进程的call()方法接受以下参数:

  • args: 它是你想执行的命令。你可以通过用分号(;)分开来传递多个命令
  • stdin。这指的是标准输入流的值,以(os.pipe())的形式传递。
  • stdout:它是标准输出流获得的值
  • stderr:它处理任何从标准错误流中发生的错误
  • shell:这是一个布尔参数,如果保持为真,就在一个新的shell中执行程序。

Python中子进程的Call()方法的返回值

Python子进程的Call()函数返回程序的执行代码。如果没有程序输出,该函数将返回它成功执行的代码。它也可能引发一个CalledProcessError异常。

现在,使用一个简单的例子,为内置的Unix命令 "ls -l "调用一个子进程。ls命令列出了一个目录中的所有文件,而-l命令则以扩展格式列出了这些目录。

import subprocess

subprocess.call(["ls", "-l"])

输出:

SubprocessInPython_2

就这么简单,输出显示文件的总数以及当前的日期和时间。

什么是Python中子进程的保存进程输出(stdout)?

保存进程输出或stdout允许你在check_output函数的帮助下将代码的输出直接存储在一个字符串中。这个方法的语法是:

subprocess.check\_output(args, \*, stdin=None, stderr=None, shell=False, universal\_newlines=False)

正如你所看到的,该函数接受的参数与call()方法相同,只是多了一个参数,那就是:

  • universal_newlines。这是一个布尔参数,当保持为 "true "时,以通用换行方式打开stdout和stderr的文件。

该方法还返回与call()函数相同的值。现在,再看一个简单的例子。这一次你将使用Linux的echo命令用来打印与之一起传递的参数。你将把 echo 命令的输出存储在一个字符串变量中,并使用 Python 的 print 函数打印它。

import subprocess

s = subprocess.check_output(["echo", "Hello World!"])

print(s)

输出:

SubprocessInPython_3

在Python中使用子进程的例子

让我们结合Python中子进程的call()和check_output()函数来执行来自不同编程语言的 "Hello World "程序。C、C++和Java。你首先要创建三个独立的文件,命名为Hello.c、Hello.cpp和Hello.java来开始。制作完这些文件后,你将在这些文件中编写各自的程序,以执行 "Hello World!"让我们开始做我们的三个文件。

包含在Hello.c文件中的代码

创建一个Hello.c文件,并在其中写入以下代码。

#include<stdio.h>

int main()

{

    printf("C says Hello World!");

    // returning with 0 is essential to call it from Python

    return 0;

}

写在Hello.cpp文件中的代码

在Hello.c之后,创建Hello.cpp文件,并在其中写入以下代码。

#include <iostream>

using namespace std;

int main()

{

    int a, b;

    cin >> a >> b;

    cout << "C++ says Hello World! Values are:" << a << " " << b;

return 0;

}

在这里,这个演示也使用了整数变量来存储一些数值,并通过stdin参数来传递它们。 写在Hello.java文件中的代码

在你的Hello.java文件中使用以下代码:

class Hello{

public static void main(String args\[\]){

System.out.print("Java说Hello World!")。

}

}

在Main.py文件中编写代码以执行Python中的子进程

一旦你创建了这三个独立的文件,你就可以开始使用Python中子进程的调用()和输出()函数。下面是你需要放在 main.py 文件中的代码。

import subprocess

import os

def C_Execution():

# storing the output

s = subprocess.check_call("gcc Hello.c -o out1;./out1", shell = True)

print(", return code", s)

def Cpp_Execution():

    # creating a pipe to child process

    data, temp = os.pipe()

    # writing inputs to stdin and using utf-8 to convert it to byte string

    os.write(temp, bytes("7 12\n", "utf-8"));

    os.close(temp)

    # storing output as a byte string

    s = subprocess.check_output("g++ Hello.cpp -o out2;./out2", stdin = data, shell = True)

    # decoding to print a normal output

    print(s.decode("utf-8"))

def Java_Execution():

# storing the output

s = subprocess.check_output("javac Hello.java;java Hello", shell = True)

print(s.decode("utf-8"))

# Driver functions

if __name__=="__main__":

C_Execution()

Cpp_Execution()

Java_Execution()

输出:

SubprocessInPython_4

总结

在这篇文章中,你已经了解了Python中的子进程。现在你可以轻松地使用子进程模块,从你的Python代码中运行外部程序。这个模块的两个主要函数是 call() 和 output() 函数。一旦你练习并学会适当地使用这两个函数,你在Python中创建和使用子进程时就不会遇到太多的麻烦。