c语言编程笔录

首页 >   > 笔记大全

笔记大全

使用Python Popen执行命令 实现系统操作

更新时间:2024-01-02

什么是Python Popen?

Python Popen是一个用于执行命令的类。它允许我们通过一个子进程调用外部程序,并在Python代码中执行它。 Python中的Popen类像我们使用shell终端时执行命令一样执行这些命令,并返回我们可以使用的结果。

这里是一个简单的Python Popen命令执行示例:

import subprocess

subprocess.Popen("dir")

这个示例打开一个新的命令窗口,并列出了Windows上的当前目录中的所有文件和子目录。Python获得了Popen类的结果,该结果实际上是一个运行进程的详细信息对象,包括返回码。

Python Popen的参数:

Python Popen类有许多可用的参数,以下是一些最常用的:

  • args:我们想要在子进程中执行的命令。这个参数是必需的。
  • shell:这个参数是一个bool值,指定命令是否应该从shell运行。如果是,则该命令将在操作系统的默认shell中执行。
  • stdin:这个参数提供子进程的标准输入。默认情况下,它是null。
  • stdout:这个参数接收子进程的标准输出。默认情况下,它是null。
  • stderr:这个参数接收子进程的标准错误输出。默认情况下,它是null。
  • universal_newlines:这个参数是一个bool值,当设置为True时,将文本标准化为与操作系统无关的新行(\\n)。
  • env:这个参数允许我们设置子进程中的环境变量。这是一个字典,其中键是变量的名称,而值是值。
以下是一个使用Python Popen类的更完整的示例:
import subprocess

# args参数是必需的,指定子进程要执行的命令
process = subprocess.Popen(["python", "--version"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)

# 此时,我们的命令已在子进程中执行,并且我们要捕捉其输出
out, err = process.communicate()

# 输出结果
print("============== Subprocess Output ===============")
print(out.decode())
print(err.decode())
print("============== Subprocess Finished =============")
这个示例演示了如何使用Python Popen类来调用Python命令,在子进程中执行命令,并捕获输出。 它还演示了如何将stdout和stderr分别重定向到不同的对象中。

Python中使用Popen运行多个并行进程

Python Popen还可以用来创建一个可以运行多个并行进程的程序。以下示例演示如何使用Python Popen运行多个并行进程:

import subprocess

# 创建一个要运行的进程列表
process_list = [
    subprocess.Popen(["ping", "-n", "4", "www.google.com"], stdout=subprocess.PIPE, stderr=subprocess.PIPE),
    subprocess.Popen(["ping", "-n", "4", "www.facebook.com"], stdout=subprocess.PIPE, stderr=subprocess.PIPE),
    subprocess.Popen(["ping", "-n", "4", "www.yahoo.com"], stdout=subprocess.PIPE, stderr=subprocess.PIPE),
    subprocess.Popen(["ping", "-n", "4", "www.stackoverflow.com"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
]

# 对进程列表进行循环,并等待所有进程完成
for process in process_list:
    output, error = process.communicate()
    print(output.decode())
    print(error.decode())
这个示例创建了一个要运行的进程列表,并通过对列表进行循环来等待所有进程完成。每个进程都是通过Python Popen类实例化的。它们将所有的标准输出重定向到一个由我们提供的对象中。

Python Popen的安全性问题

虽然Python Popen类非常有用,但要小心使用。它允许我们在相同的进程上下文中执行命令,这可能会导致安全问题。因此,我们应该避免接受来自不可信来源的用户输入并直接将其传递给Python Popen类。 相反,我们应该执行所有必要的验证,并使用shlex.split()函数解析命令行参数。以下示例演示了如何安全地使用Python Popen类:

import subprocess
import shlex

command = input("请输入一个有效的命令:")

# 首先,我们将通过shlex.split()函数解析命令行参数
command_list = shlex.split(command)

# 然后,我们可以实例化一个Python Popen类,并以安全方式执行命令
process = subprocess.Popen(command_list, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = process.communicate()

# 输出结果
print("============== Subprocess Output ===============")
print(out.decode())
print(err.decode())
print("============== Subprocess Finished =============")
在这个示例中,我们使用shlex.split()函数解析用户输入的命令,这会帮助我们避免命令注入攻击,并确保所有参数都被正确解析。然后,我们可以安全地实例化一个Python Popen类,并从命令输出中捕获结果。