【Python】运行其他程序、命令和文件

news/2024/7/24 13:01:44 标签: python, 开发语言

2.10 运行其他程序、命令和打开文件

有时候我们需要通过Python来运行某些程序、命令或者打开文件。这里将介绍一些常见的方法。

2.10.1 os.startfile(文件、程序)

这个函数可以直接打开一个文件或者程序,就像双击一样。非阻塞。

import os

os.startfile("C:\\Windows\\System32\\calc.exe") # 打开计算器
os.startfile("E:\\logs\\loglog.xlsx")  # 使用默认程序打开文件

2.10.2 os.system(文件、程序、命令)

使用os.system()函数可以执行一个系统命令,并返回一个退出码。正常返回0,否则返回1。命令阻塞,带路径文件或程序非阻塞。

import os

os.system("C:\\Windows\\System32\\calc.exe")  # 执行系统命令
os.system('notepad')  # 打开记事本程序
os.system('notepad 1.txt')  # 打开1.txt文件,如果不存在,则创建
exitcode = os.system('dir')  # 列出当前工作下所有文件,并返回退出码

print(exitcode)

2.10.3 os.popen(文件、命令、程序)

还有一种方法是使用os.popen()函数运行其他程序,它可以执行一个系统命令,并返回一个文件对象,可以读取或写入该对象。
例如:

import os

f = os.popen("dir")  # 执行系统命令并返回文件对象
print(f.read())  # 读取文件对象的内容
f.close()  # 关闭文件对象
f = os.popen("e:\\logs\\log.txt")  # 打开文件

2.10.4 subprocess.Popen(程序)

还有一种方法是使用subprocess模块运行其他程序,它可以创建一个子进程,并与之交互。
import subprocess
p = subprocess.Popen(“C:\Windows\System32\calc.exe”) # 创建一个子进程
p.wait() # 等待子进程结束

### 2.10.5 subprocess.run(命令)
subprocess模块的run方法可以执行命令。
cmd = 'wmic computersystem get model'
result = subprocess.run(cmd, stdout=subprocess.PIPE, shell=True, check=True)
model_identifier = result.stdout.strip()
print(str(model_identifier, 'utf-8').split('\n')[1])

2.10.6 win32api.ShellExecute(文件、程序)

使用ShellExecute函数可以指定打开方式,如打开、编辑、打印等。非阻塞。
语法如下:
ShellExecute(hwnd, op, file, args, dir, show)
参数说明:
hwnd: 父窗口的句柄,如果没有父窗口,则为0
op : 要运行的操作,为open、print或者为空字符串
file : 要运行的程序,或者打开的脚本
args : 要向程序传递的参数,如果打开的是文件则为空字符串
dir : 程序初始化的目录
show : 是否显示窗口,1:前台打开;0:后台执行
示例:

import win32api

win32api.ShellExecute(0, "open", "C:\\Windows\\System32\\calc.exe", "", "", 1) # 打开计算器
win32api.ShellExecute(0, 'open', 'notepad.exe', '', '', 0)  # 后台执行
win32api.ShellExecute(0, 'open', 'notepad.exe', '', '', 1)  # 前台打开
win32api.ShellExecute(0, 'open', 'notepad.exe', '1.txt', '', 1)  # 打开文件
win32api.ShellExecute(0, 'open', 'http://www.baidu.com', '', '', 1)  # 打开网页
win32api.ShellExecute(0, 'open', 'D:\\music.mp3', '', '', 1)  # 播放视频
win32api.ShellExecute(0, 'open', 'D:\\mypy1.py', '', '', 1)  # 运行程序

2.10.7 win32process.CreateProcess(程序)

还有一种方法是使用CreateProcess函数运行其他程序,它可以创建一个运行相应程序的进程,并返回进程句柄、线程句柄、进程ID以及线程ID。
语法如下:
CreateProcess(appName, cmdLine, proAttr, threadAttr, InheritHandle, CreationFlags, newEnv, currentDir, Attr)
参数说明:
appName 可执行文件名
cmdLine 命令行参数
procAttr 进程安全属性
threadAttr 线程安全属性
InheritHandle 继承标志
CreationFlags 创建标志
currentDir 进程的当前目录
Attr 创建程序的属性
示例:

import win32process

hProcess, hThread, dwProcessId, dwThreadId = win32process.CreateProcess(None, "C:\\Windows\\System32\\calc.exe", None, None, 0, 0, None, None, win32process.STARTUPINFO())

可以使用win32process.TerminateProcess函数来结束已创建的进程。
语法如下:
TerminateProcess(handle, exitCode)
参数说明:
handle 要操作的进程句柄
exitCode 进程退出代码
也可以使用win32event.WaitForSingleObject等待创建的线程结束。
语法如下:
WaitForSingleObject(handle, milisecond)
参数说明:
handle : 要操作的进程句柄
milisecond: 等待的时间,如果为-1,则一直等待.
示例:

import win32process
import time

handle = win32process.CreateProcess('C:\\Windows\\notepad.exe', '', None, None, 0, win32process.CREATE_NO_WINDOW, None, None, win32process.STARTUPINFO())  # 打开记事本,获得其句柄
time.sleep(3)
win32process.TerminateProcess(handle[0], 0)  # 终止进程

或者使用win32event.WaitForSingleObject等待进程结束。

import win32event
import win32process

handle = win32process.CreateProcess('C:\\Windows\\notepad.exe', '', None, None, 0, win32process.CREATE_NO_WINDOW, None, None, win32process.STARTUPINFO())  # 创建进程获得句柄
print(win32event.WaitForSingleObject(handle[0], -1))  # 等待进程结束

http://www.niftyadmin.cn/n/376920.html

相关文章

华清远见 day02

运算符 自增 () 自减(--) yx; 先运算后自增 [先赋值] ​ yx; 先自增后运算 [先自增] 区别是先运算后自增, 还是先自增后运算; yx--; ​ y--x; 不参与 赋值运算 时 效果相同; ​ x; x; 在三目运算符中同理 三目运算符 (短路运算) 格式: 条件 ? 值1[表达式]:值2[表达式] max …

怎么做判空比较好

为了避免空指针调用,我们经常会看到这样的语句。 ... if (someobject ! null) {someobject.doCalc(); } ...最终,项目中会存在大量判空代码,多么丑陋繁冗!如何避免这种情况?我们是否滥用了判空呢? 「精华…

uni-app扩展组件(uni-ui)

目录 数字角标(uni-badge) 代码示例: 面包屑(uni-breadcrumb) 代码示例: 日历 代码示例 卡片(uni-card) 代码示例 倒计时(uni-countdown) 更多内容请访问官网 数字角标(uni-badge) 数字角标一般和其它控件(列表、9宫格等&#xff0…

华为OD机试真题B卷 Java 实现【24点游戏算法】,附详细解题思路

一、题目描述 给出4个1-10的数字,通过加减乘除运算,得到数字为24就算胜利,除法指实数除法运算,运算符仅允许出现在两个数字之间,本题对数字选取顺序无要求,但每个数字仅允许使用一次,且需考虑括号运算 此题允许数字重复&#xff…

LaTeX minted报错Package minted Error: Missing Pygments output

在确认已使用pip install Pygments命令安装好Pygments包并在 TEX 文件的开头添加了 \usepackage[utf8]{inputenc} \usepackage[english]{babel} \usepackage[cachefalse]{minted}后,使用pdflatex -shell-escaped WA1.tex命令编译 TEX 文件报错: (./_min…

uni-app生命周期有哪些?怎么理解?

uni-app生命周期有哪些?怎么理解? uni-app生命周期有哪些?怎么理解? 文章目录 uni-app生命周期有哪些?怎么理解?前言一、什么是生命周期函数?二、uni-app生命周期分类总结 前言 UNI-APP学习系…

mysql中的count(1)、count(*)、count(id)哪个更快?

今天和大家聊一下mysql中的count()方法 我们日常开发中,经常会用到count()命令,有的人用count(*),有的人用count(1),还有的人用count(id),那么这几种写法都有什么区别呢?哪种方法效率更高呢?今…

深度学习实战项目(三)-行人检测重识别yolov5+reid(跑通+界面设计)

行人检测重识别yolov5reid(跑通界面设计) 参考源代码: github 权重文件: 根据github上面的网盘进行权重下载: 检测:将 ReID_resnet50_ibn_a.pth放在person_search/weights文件下,yolov5s.pt放person_sear…