如何异步使用os.system,使其独立于Python进程?

2 投票
1 回答
7153 浏览
提问于 2025-04-17 00:17

当你使用 os.system 来打开一个文件,比如说 os.system(r'C:/foo.txt'),当前的 Python 进程会等待这个操作完成后才继续执行,也就是说,直到你打开的文本编辑器关闭之前,程序都不会往下走。
我需要用线程来让这个操作变得异步吗?

想象一下这样的情况:

我正在用 Python 为 Windows 写一个文件管理器。用户点击了一个文件。此时使用 os.system(the_path_to_the_file_clicked) 会用系统默认的程序打开这个文件,这个默认程序是在注册表中设置的。
如果用线程来让这个系统调用异步执行是可行的,但如果用户关闭了文件管理器呢?此时 Python 进程会一直保持运行,直到线程结束,但这样不是多余吗?另一方面,如果结束了 Python 进程,线程也会被终止,程序就会关闭。

有没有办法使用系统调用来打开一个新的进程,而不依赖于 Python 进程呢?

1 个回答

5

如果你想在Windows上用默认程序打开一个文件,有一个特别的功能可以做到这一点,它会异步地打开文件,也就是说它不会影响你自己程序的运行。这个功能叫做 os.startfile,用这个就可以实现你想要的效果。

更一般来说,如果你想要异步运行程序,os.system 是做不到的。不过,subprocess模块 可以做到。这个模块几乎可以完成 os.system 能做的所有事情,而且功能更多。不过要注意的是,使用 subprocess.Popen 时,打开的程序并不是独立于你的程序运行的——也就是说,当你的程序结束时,这个子程序也会一起结束。

撰写回答