Python中的子进程简介及示例
![]()
目录
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)
输出:
![]()
在上面的代码中,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"])
输出:
![]()
就这么简单,输出显示文件的总数以及当前的日期和时间。
什么是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)
输出:
![]()
在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()
输出:
![]()
总结
在这篇文章中,你已经了解了Python中的子进程。现在你可以轻松地使用子进程模块,从你的Python代码中运行外部程序。这个模块的两个主要函数是 call() 和 output() 函数。一旦你练习并学会适当地使用这两个函数,你在Python中创建和使用子进程时就不会遇到太多的麻烦。