通过与 Jira 对比,让您更全面了解 PingCode

  • 首页
  • 需求与产品管理
  • 项目管理
  • 测试与缺陷管理
  • 知识管理
  • 效能度量
        • 更多产品

          客户为中心的产品管理工具

          专业的软件研发项目管理工具

          简单易用的团队知识库管理

          可量化的研发效能度量工具

          测试用例维护与计划执行

          以团队为中心的协作沟通

          研发工作流自动化工具

          账号认证与安全管理工具

          Why PingCode
          为什么选择 PingCode ?

          6000+企业信赖之选,为研发团队降本增效

        • 行业解决方案
          先进制造(即将上线)
        • 解决方案1
        • 解决方案2
  • Jira替代方案

25人以下免费

目录

python如何控制外部程序

python如何控制外部程序

Python控制外部程序的方式有多种,包括使用subprocess模块、os模块、以及第三方库psutil。其中,subprocess模块是最常用的方式。下面将详细介绍如何使用subprocess模块来控制外部程序,并提供一些实际应用的示例。

一、SUBPROCESS模块

1. 介绍

subprocess模块是Python标准库中的一个模块,用于生成新的进程、连接到其输入/输出/错误管道,并获得其返回码。它是一个强大的工具,可以替代os.system、os.spawn*、os.popen*等旧有的方式。

2. 基本用法

使用subprocess模块生成一个新的进程并执行外部命令非常简单。以下是一个基本的示例:

import subprocess

执行外部命令'ls'

result = subprocess.run(['ls'], stdout=subprocess.PIPE)

print(result.stdout.decode())

在这个例子中,我们使用subprocess.run方法执行了ls命令,并将输出捕获到result.stdout中。

3. 捕获输出

为了捕获外部程序的输出,可以使用stdoutstderr参数:

import subprocess

执行外部命令'ls'并捕获输出

result = subprocess.run(['ls'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)

print("Standard Output:", result.stdout.decode())

print("Standard Error:", result.stderr.decode())

4. 传递输入

我们也可以通过stdin参数向外部程序传递输入:

import subprocess

向外部命令'grep'传递输入

process = subprocess.Popen(['grep', 'hello'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

output, error = process.communicate(input='hello world\nhello Python\n')

print(output.decode())

5. 超时

subprocess模块还支持设置超时时间,如果外部程序在指定时间内没有完成执行,可以自动终止:

import subprocess

try:

result = subprocess.run(['sleep', '5'], timeout=2)

except subprocess.TimeoutExpired:

print("Process timed out")

二、OS模块

1. 介绍

虽然subprocess模块功能更强大,但os模块也可以用于一些简单的任务,比如启动外部程序:

import os

使用os.system执行外部命令

os.system('ls')

2. 进程管理

os模块还提供了进程管理功能,例如终止进程:

import os

import signal

启动一个子进程

pid = os.fork()

if pid == 0:

while True:

pass

else:

# 终止子进程

os.kill(pid, signal.SIGKILL)

三、第三方库PSUTIL

1. 介绍

psutil是一个跨平台库,用于检索系统利用率(包括CPU、内存、磁盘、网络、传感器)的信息以及管理进程。它提供了比os和subprocess更多的功能。

2. 安装

首先,安装psutil库:

pip install psutil

3. 使用

使用psutil可以轻松获取系统信息和管理进程:

import psutil

获取CPU利用率

cpu_usage = psutil.cpu_percent(interval=1)

print(f"CPU Usage: {cpu_usage}%")

获取内存信息

memory_info = psutil.virtual_memory()

print(f"Memory Usage: {memory_info.percent}%")

获取进程信息

for process in psutil.process_iter(['pid', 'name']):

print(process.info)

四、实际应用示例

1. 监控系统资源

使用psutil库监控系统资源,例如CPU、内存、磁盘和网络的使用情况:

import psutil

def monitor_system_resources():

print(f"CPU Usage: {psutil.cpu_percent(interval=1)}%")

memory_info = psutil.virtual_memory()

print(f"Memory Usage: {memory_info.percent}%")

disk_info = psutil.disk_usage('/')

print(f"Disk Usage: {disk_info.percent}%")

net_info = psutil.net_io_counters()

print(f"Network Sent: {net_info.bytes_sent} bytes, Received: {net_info.bytes_recv} bytes")

if __name__ == "__main__":

monitor_system_resources()

2. 终止进程

使用psutil库终止一个占用过多资源的进程:

import psutil

def kill_heavy_process(threshold=80):

for proc in psutil.process_iter(['pid', 'name', 'cpu_percent']):

if proc.info['cpu_percent'] > threshold:

print(f"Killing process {proc.info['name']} (PID: {proc.info['pid']})")

psutil.Process(proc.info['pid']).terminate()

if __name__ == "__main__":

kill_heavy_process()

3. 执行定时任务

使用subprocess模块执行定时任务,例如每隔一段时间运行一个外部脚本:

import subprocess

import time

def run_scheduled_task(script_path, interval=60):

while True:

subprocess.run(['python', script_path])

time.sleep(interval)

if __name__ == "__main__":

run_scheduled_task('path/to/your/script.py')

五、总结

通过subprocess模块os模块第三方库psutil,我们可以方便地控制和管理外部程序。subprocess模块适用于大多数场景,可以执行外部命令并捕获其输出;os模块适用于一些简单的任务和进程管理;而psutil库则提供了更强大的系统监控和进程管理功能。

在实际应用中,根据具体需求选择合适的工具和方法,可以大大提高编程效率和代码的可读性。希望通过本文的介绍,您对Python控制外部程序有了更深入的了解和掌握。

相关问答FAQs:

如何使用Python启动外部程序并获取输出?
使用Python可以通过subprocess模块来启动外部程序并获取它们的输出。通过subprocess.run()subprocess.Popen()函数,可以执行命令并捕获其标准输出和错误信息。示例代码如下:

import subprocess

result = subprocess.run(['ls', '-l'], capture_output=True, text=True)
print(result.stdout)

在这个示例中,Python将执行ls -l命令并打印出其输出。

Python控制外部程序时如何处理错误?
在执行外部程序时,可能会遇到各种错误,如文件未找到、权限不足等。可以通过捕获异常来处理这些错误。例如,使用subprocess.run()时,可以检查返回的returncode来判断是否成功执行。如果非零值表示执行失败,可以根据需要进行进一步处理或输出错误信息。

使用Python控制外部程序是否有跨平台的限制?
Python可以在不同操作系统中控制外部程序,但需要注意的是,某些命令在不同平台之间可能存在差异。例如,Windows系统上常用的命令与Linux或macOS的命令并不完全相同。因此,在编写跨平台的脚本时,最好使用条件语句来根据操作系统选择适当的命令或参数,以确保代码的可移植性。

相关文章