📜  如何在 python 脚本中运行 shell 命令 ctrl + c - Python (1)

📅  最后修改于: 2023-12-03 14:52:31.388000             🧑  作者: Mango

如何在 Python 脚本中运行 Shell 命令 ctrl + c

在 Python 脚本中运行 Shell 命令是非常常见的操作,可以利用 Python 的 subprocess 模块来实现。本篇文章将会介绍如何在 Python 脚本中运行 Shell 命令,并且在运行命令时可以使用 CTRL + C 组合键来终止正在运行的命令进程。

方法一: 简单的调用 shell 命令

要在 Python 脚本中运行 Shell 命令,可以使用 subprocess 模块中的 run() 方法,如下所示:

import subprocess

result = subprocess.run(["ls", "-l"], stdout=subprocess.PIPE)
print(result.stdout.decode())

在这个例子中,我们调用了 Linux 上的 ls 命令,然后通过 stdout=subprocess.PIPE 参数将命令的输出捕获到了 Python 的变量中。最后,我们通过 decode() 方法将捕获的二进制数据转换为 utf-8 字符。

方法二: 带时限的调用 shell 命令

如果我们需要在 Python 中设置超时时间来调用 Shell 命令,则可以使用 subprocess.run() 中的 timeout 参数来设置超时时间。例如:

import subprocess

try:
    result = subprocess.run(['sleep', '5'], timeout=3, check=True)
except subprocess.TimeoutExpired:
    print("command timed out")

在这个例子中,我们通过 subprocess.run(['sleep', '5'], timeout=3, check=True) 来模拟执行一条需花费 5 秒钟的命令,但在 Python 中我们设置了命令执行超时时间为 3 秒钟。当命令执行时间超过 3 秒钟时,Python 会抛出 subprocess.TimeoutExpired 异常。

方法三: 运行长时间的 shell 命令时使用 CTRL + C

在 Python 中运行 Shell 命令时,有时会需要能够通过按下 CTRL + C 组合键来终止正在执行的命令。要实现此功能,我们可以使用 signal 模块。例如:

import subprocess
import signal

command = "ping 127.0.0.1"

with subprocess.Popen(command, shell=True, preexec_fn=os.setsid) as process:
    try:
        process.wait(timeout=10)
    except subprocess.TimeoutExpired:
        print("command timed out, terminating process")
        os.killpg(process.pid, signal.SIGINT)
        process.wait()

在这个例子中,我们使用 subprocess.Popen() 方法来启动一个 ping 命令的子进程,然后使用 os.setsid 将进程放到一个新的进程组中。这样做的目的是为了后续可以使用 os.killpg() 终止整个进程组。 然后,我们使用 process.wait(timeout=10) 进行等待,等待命令进程执行完毕,或者执行超时(例如,这里设置的时间是 10 秒钟)。假如在运行的过程中需要停止执行该命令,则可以通过 os.killpg() 给整个进程组发送 CTRL + C 信号来达到终止进程的效果。

总结

本篇文章主要讲解了如何在 Python 脚本中调用 Shell 命令,以及如何使用 CTRL + C 组合键停止 Shell 命令。 使用 subprocess 模块,我们可以轻松地在 Python 中运行任何 Shell 命令,并且能够灵活控制命令的输入输出。同时,我们也介绍了如何使用 signal 模块来停止正在运行的命令进程。