文章目录
- 启动程序的其他方法
- `os.spawn`函数家族
- *Windows*下的`os.startfile`调用
- 使用*DOS*的`start`命令
- `os.startfile`调用
启动程序的其他方法
os.spawn
函数家族
os.spawn
家族的名称中,和os.exec
类似,“l”表示需要将参数分别列出,“p”则代表在系统路径中寻找可执行文件,而“e”表示向派生程序传入一个提供shell环境变量的字典,但带“p”的函数在Windows下不受支持;Windows系统可支持所有进程模式标志,但分离模式和覆盖模式在Unix下不受支持。os.spawnv
和os.spawnve
在Windows和Unix系统中都可以运行。
在基本操作方面,它们类似于在Unix下fork
、exec
调用结合并可以替代我们之前学到的system
和popen
调用。
>>> print(open('make_words.py').read())
#!/usr/bin/env python
"测试程序"
def main():
print('spam')
print('eggs')
print('ham')
if __name__ == '__main__':
main()
>>> import os
>>>
>>> os.system('python make_words.py')
spam
eggs
ham
0
>>> results = os.popen('python make_words.py').read()
>>> print(results)
spam
eggs
ham
>>> import sys
>>> py_path_str = sys.executable
>>> os.spawnv(os.P_WAIT, py_path_str, ('python', 'make_words.py'))
spam
eggs
ham
0
>>> os.spawnv(os.P_NOWAIT, py_path_str, ('python', 'make_words.py'))
8622
>>> spam
eggs
ham
-
spawn
函数家族非常类似Unix下的分支程序,但它们不会去复制它们的进程(因此共享描述符不起作用),不过它们可以用来启动一个完全独立于它们的调用者而运行的程序。
示例:spawnv.py
#!/usr/bin/env python
"测试os.spawnv"
import os
import sys
def main():
platform_str = sys.platform
py_path_str = sys.executable
if platform_str[:3] == 'win':
for i_id_int in range(10):
pid_int = os.spawnv(
os.P_NOWAIT, py_path_str, ('python', 'child.py', str(i_id_int))
)
print('Process {} spawned'.format(pid_int))
else:
for i_id_int in range(10):
pid_int = os.fork()
if pid_int:
print('Process {} spawned'.format(pid_int))
else:
os.execlp('python', 'python', 'child.py', str(i_id_int))
print('Main process exit')
if __name__ == '__main__':
main()
输出:spawnv.py
Process 10732 spawned
Process 10733 spawned
Process 10734 spawned
Process 10735 spawned
Process 10736 spawned
Process 10737 spawned
Process 10738 spawned
Process 10739 spawned
Process 10740 spawned
Process 10741 spawned
Main process exit
Hello from child! 10732 0
Hello from child! 10733 1
Hello from child! 10737 5
Hello from child! 10738 6
Hello from child! 10736 4
Hello from child! 10735 3
Hello from child! 10734 2
Hello from child! 10741 9
Hello from child! 10739 7
Hello from child! 10740 8
-
os.spawnv
:期待一个进程模式标识符,Python解释器的完整路径,以及一个代表用于启动新进程的shell命令行的字符串构成的元组。 -
sys.executable
:正在运行脚本的Python解释器执行程序的路径。 - 进程模式标识符:
-
os.P_NO_WAIT
和os.P_WAITO
:spawn
函数将在进城创建后返回,返回值为进程ID。二者在Unix和Windows下均可用。 -
os.P_WAIT
:spawn
函数在新进程结束前不会返回,如果成功运行,则返回进程的退出代码;如果进程被一个信号终止了,则返回“-signal”。它在Unix和Windows下皆可用。 -
os.P_DETACH
和os.P_OVERLAY
:P_DETACH
类似于P_NOWAIT
,不过新的进程从调用它的进程的控制台中分离出来。如果使用了P_OVERLAY
,那么当前程序将会被覆盖(类似os.exec
)。二者仅在Windows下可用。
- 子程序的输出在
spawnv.py
运行的控制台中出现;当使用P_NOWAIT
时,标准输出指向父进程的控制台,但如果使用P_DETACH
,它的输出流看起来没流向任何地方。
目前的subprocess
和multiprocessing
模块都提供用命令行派生程序的具有可移植性的替代方案。事实上,除非os.spawn
提供不可或缺的独特行为,最好使用更具可移植性的multiprocessing
模块。
Windows下的os.startfile
调用
使用DOS的start
命令
os.system
调用可用来在Windows下启动一个DOS的start
命令,后者基于一个文件的Windows文件名关联,独立地打开(即运行)这个文件,就像单击打开一样。
os.startfile
调用
os.startfile(filename)