Subprocess

利用Python内建的 subprocess 模块可以做很多事情,比如中Popen()函数可以启动计算机中的其他程序。

在 Windows 计算机上,输入以下代码, 打开计算器:

1
2
3
4
5
import subprocess 
subprocess.Popen('C:\\Windows\\System32\\calc.exe')
# <subprocess.Popen at 0x516c188>
subprocess.Popen('C:\\Windows\\System32\\calc.exe')
# <subprocess.Popen at 0x51684c8>

在在 Ubuntu Linux 上,可以输入以下代码:

1
2
3
import subprocess 
subprocess.Popen('/usr/bin/gnome-calculator')
<subprocess.Popen object at 0x7f2bcf93b20>

返回值是一个 Popen 对象,它有两个有用的方法:poll()和 wait()。

1
2
3
4
5
6
7
8
9
10
calcProc = subprocess.Popen('c:\\Windows\\System32\\calc.exe') 
## 返回None表示该进程仍在运行
calcProc.poll() == None
True
## 关闭计算器程序
calcProc.wait() ## wait()方法将阻塞,直到启动的进程终止,返回值是进程的整数退出代码
# 0
calcProc.poll() ## 退出代码为0,表示正常终止,退出代码非零,通常为1,表示错误终止
# 0
## 表明该进程终止且无错

我们还可以用来打开python程序,比如:

1
2
subprocess.Popen(['C:\\python\\python.exe', 'helloWorld.py']) 
# <subprocess.Popen object at 0x000000000331CF28>

利用参数,我们还可以让subprocess用默认的应用程序打开文件 :

1
2
3
4
5
6
7
fileObj = open('hello.txt', 'w') 
fileObj.write('Hello world!')
# 12
fileObj.close()
import subprocess
## Windows:start/OS X:open/Unix:see
subprocess.Popen(['start', 'hello.txt'], shell=True)

Win32

CreateProcess(appName, commandLine , processAttributes , threadAttributes , bInheritHandles ,dwCreationFlags , newEnvironment , currentDirectory , startupinfo )

其参数含义如下。
appName:可执行的文件名。
commandLine:命令行参数。
processAttributes:进程安全属性,如果为None,则为默认的安全属性。
threadAttributes:线程安全属性,如果为None,则为默认的安全属性。
bInheritHandles:继承标志。
dwCreationFlags:创建标志。
newEnvironment:创建进程的环境变量。
currentDirectory:进程的当前目录。
startupinfo :创建进程的属性。

1
2
import win32api
win32api.ShellExecute(0, 'open', 'notepad.exe', '','',0)

REFERENCES