有时候我们需要通过Python来运行某些程序、命令或者打开文件。这里将介绍一些常见的方法。
这个函数可以直接打开一个文件或者程序,就像双击一样。非阻塞。
import os
os.startfile("C:\\Windows\\System32\\calc.exe") # 打开计算器
os.startfile("E:\\logs\\loglog.xlsx") # 使用默认程序打开文件
使用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)
还有一种方法是使用os.popen()函数运行其他程序,它可以执行一个系统命令,并返回一个文件对象,可以读取或写入该对象。
例如:
import os
f = os.popen("dir") # 执行系统命令并返回文件对象
print(f.read()) # 读取文件对象的内容
f.close() # 关闭文件对象
f = os.popen("e:\\logs\\log.txt") # 打开文件
还有一种方法是使用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])
使用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) # 运行程序
还有一种方法是使用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)) # 等待进程结束