为什么 Python 的子进程的 popen 在 unix 和 windows 之间如此不同?
Why is Python's subprocess' popen so different between unix and windows?
我正在尝试在 Python 中编写跨平台代码。该代码应该生成新的 shell 和 运行 代码。
这促使我查看 Python 的 subprocess
工具,尤其是其 Popen
部分。因此,我通读了此 class Popen doc 的文档,发现了太多 "if on Unix/if on Windows" 语句。不是很跨平台,除非我误解了文档。
这是怎么回事?我知道这两个操作系统是不同的,但真的没有办法写一个通用的接口吗?我的意思是,相同的参数 "windows is different than unix" 可以应用于 os
、system
等,而且它们似乎都是 100% 跨平台的。
问题是进程管理是操作系统中根深蒂固的东西,不仅在实现上有很大差异,甚至在基本功能上也有很大差异。
实际上通常很容易在 os class 中抽象代码。这两个 C 库,无论是 *nix 还是 Windows,都将文件读取实现为 I/O 流,因此您甚至可以编写在 Windows 和 * 中工作相同的相当低级的文件操作函数尼克斯
但流程差异很大。例如,在 *nix 中,进程都是分层的,每个进程都有一个父进程,所有进程都返回到 PID 1 下的初始化系统 运行。一个新进程通过分叉自身创建,检查它是父进程还是子进程然后相应地继续。
在 Windows 中,进程是严格非分层的,由 CreateProcess () 系统调用创建,为此您需要特殊权限。
还有很多差异,这些只是两个例子,但我希望它表明实现一个平台独立的进程库是一项非常艰巨的任务。
我正在尝试在 Python 中编写跨平台代码。该代码应该生成新的 shell 和 运行 代码。
这促使我查看 Python 的 subprocess
工具,尤其是其 Popen
部分。因此,我通读了此 class Popen doc 的文档,发现了太多 "if on Unix/if on Windows" 语句。不是很跨平台,除非我误解了文档。
这是怎么回事?我知道这两个操作系统是不同的,但真的没有办法写一个通用的接口吗?我的意思是,相同的参数 "windows is different than unix" 可以应用于 os
、system
等,而且它们似乎都是 100% 跨平台的。
问题是进程管理是操作系统中根深蒂固的东西,不仅在实现上有很大差异,甚至在基本功能上也有很大差异。 实际上通常很容易在 os class 中抽象代码。这两个 C 库,无论是 *nix 还是 Windows,都将文件读取实现为 I/O 流,因此您甚至可以编写在 Windows 和 * 中工作相同的相当低级的文件操作函数尼克斯
但流程差异很大。例如,在 *nix 中,进程都是分层的,每个进程都有一个父进程,所有进程都返回到 PID 1 下的初始化系统 运行。一个新进程通过分叉自身创建,检查它是父进程还是子进程然后相应地继续。 在 Windows 中,进程是严格非分层的,由 CreateProcess () 系统调用创建,为此您需要特殊权限。 还有很多差异,这些只是两个例子,但我希望它表明实现一个平台独立的进程库是一项非常艰巨的任务。