2015-10-21 72 views
1

我正在尝试在Python中编写跨平台代码。代码应该产生新的shell并运行代码。为什么Python的子进程在unix和windows之间变得如此不同?

这导致我看一下Python的工具subprocess,尤其是其Popen一部分。所以我阅读了这个类Popen doc的文档,并发现太多“如果在Unix上/如果在Windows上”语句。除非我误解了文档,否则不是非常跨平台的。

这是怎么回事?我明白这两个操作系统是不同的,但真的,没有办法编写一个通用接口?我的意思是,“windows与unix不同”的相同论点可以应用于os,system等,并且它们看起来都是100%跨平台的。

回答

2

问题在于,流程管理是深深植根于操作系统的东西,不仅在实现方面有很大不同,甚至在基本功能方面也大不相同。 实际上,在例如os类中抽象代码通常相当容易。这两个C库,无论是* nix还是Windows,都可以将文件作为I/O流来读取,因此您甚至可以编写相当低级别的文件操作函数,这些函数在Windows和* nix中的工作方式相同。

但过程差别很大。例如,在* nix中,进程都是分层的,每个进程都有一个父进程,所有进程都回到在PID 1下运行的初始化系统。一个新进程是通过分叉创建的,检查它是父进程还是继续进程。 在Windows中,进程是严格非分层的,并且由CreateProcess()系统调用创建,为此您需要特殊权限。 有很多更多的差异,这只是两个例子,但我希望它表明实现一个独立于平台的过程库是一项非常艰巨的任务。

+0

谢谢,不知道这个! – denvar

+0

+1。为了补充一点,可能是Windows和Linux之间最重要的区别(就实现用于进程管理的库API而言)是参数传递给孩子的方式。 Windows传递代表整个命令行的单个字符串,而Linux传递代表单个参数的字符串数组。这听起来可能不是什么大问题,但如果任何参数包含特殊字符都可以。程序员经常被这个问题困扰。 –

+0

调用'CreateProcess'不需要特殊的权限,除非你正在谈论运行需要提升的进程(根据完整性级别和访问令牌中已启用的组)。 'appinfo'服务提供对高架访问令牌的访问。通常,您可以使用带有“runas”动词的ShellExecute [Ex]来访问此服务。 Python的标准库通过'os.startfile'对此只有极小的支持。如果程序表现为需要提升,则可以使用'shell = True'的'Popen'。否则需要ctypes或PyWin32。 – eryksun

相关问题