📅  最后修改于: 2023-12-03 14:52:31.388000             🧑  作者: Mango
在 Python 脚本中运行 Shell 命令是非常常见的操作,可以利用 Python 的 subprocess 模块来实现。本篇文章将会介绍如何在 Python 脚本中运行 Shell 命令,并且在运行命令时可以使用 CTRL + C 组合键来终止正在运行的命令进程。
要在 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
字符。
如果我们需要在 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
异常。
在 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 模块来停止正在运行的命令进程。