subprocess子进程创建过程详解

引子

有一个需求:代码运行环境为python 3.7,用python获取系统所有别名信息。

首先想到的,就是使用subprocess模块创建子进程,执行alias命令并获取返回值。于是出现了这样一段代码:命令
毫不犹豫敲下回车键执行,结果呈现的是:
在这里插入图片描述
这是什么情况?为什么会报FileNotFoundError?问题出在哪儿?

shell内建命令和外部命令

先介绍一个概念,linux的内建命令和外部命令。

内建命令实际上是shell程序的一部分,其中包含的是一些比较简单的linux系统命令,这些命令写在bash源码里面,由shell程序识别并在shell程序内部完成运行,通常在linux系统加载运行时shell就被加载并驻留在系统内存中。

外部命令是linux系统中的实用程序部分,通常外部命令的实体并不包含在shell中,而是存放在文件中。因此,在系统加载时并不随系统一起被加载到内存中,只有在需要时才将其调用内存,由shell通过环境变量PATH,管理其执行的路径查找、加载存放,并控制其执行。

在上述例子中,调用shutil模块确认alias命令的存放位置,返回结果为空。
在这里插入图片描述
在shell中使用type命令查看,确认alias为内建命令

`subprocess.Popen()` 函数的参数具体含义和说明如下: - `args`:要执行的命令,可以是一个字符串或字符串列表。如果是一个字符串,会通过 shell 来执行命令;如果是一个字符串列表,会直接执行命令。 - `bufsize`:指定缓冲区大小,用于读取子进程的输出,默认为0,表示使用系统默认值。 - `executable`:用于指定可执行程序的路径,一般情况下不需要设置,默认为 `None`。 - `stdin`:用于指定子进程的标准输入,默认为 `None`。可以使用 `subprocess.PIPE` 创建一个管道来连接到子进程的标准输入。 - `stdout`:用于指定子进程的标准输出,默认为 `None`。可以使用 `subprocess.PIPE` 创建一个管道来连接到子进程的标准输出。 - `stderr`:用于指定子进程的标准错误,默认为 `None`。可以使用 `subprocess.PIPE` 创建一个管道来连接到子进程的标准错误。 - `preexec_fn`:用于设置一个将在子进程运行之前被调用的可调用对象(函数、方法等)。 - `close_fds`:用于指定在子进程中关闭所有打开的文件描述符,默认为 `True`。如果设置为 `False`,则会将父进程中的所有文件描述符传递给子进程。 - `shell`:用于指定是否通过 shell 来执行命令,默认为 `False`。如果设置为 `True`,则可以使用 shell 的语法来执行命令。 - `cwd`:用于指定子进程的当前工作目录,默认为 `None`,表示使用父进程的当前工作目录。 - `env`:用于指定子进程的环境变量,默认为 `None`,表示使用父进程的环境变量。 - `universal_newlines`:用于指定是否将子进程的输出转换为文本模式,默认为 `False`。如果设置为 `True`,则会将输出解码为文本。 - `startupinfo`:用于指定一个 `subprocess.STARTUPINFO` 对象,该对象包含了一些与启动新进程相关的参数。 - `creationflags`:用于指定创建进程的标志,例如创建一个新的控制台窗口。 - `restore_signals`:用于指定是否在子进程中恢复所有信号的默认处理方式,默认为 `True`。如果设置为 `False`,则子进程继承父进程中的信号处理方式。 - `start_new_session`:用于指定是否为子进程创建一个新的会话,默认为 `False`。如果设置为 `True`,则会创建一个新的会话,并成为会话的首进程。 - `pass_fds`:用于指定要传递给子进程的文件描述符列表。 - `encoding`:用于指定解码子进程输出的编码格式。 - `errors`:用于指定解码子进程输出时的错误处理方式。 以上是 `subprocess.Popen()` 函数的一些常用参数及其说明。根据实际需求,可以选择适当的参数来配置子进程的执行环境和行为。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值