如何在Windows上使用os.fork运行Python脚本?

26

os.fork() 命令在 Windows 下不受支持,并会产生以下错误:

AttributeError: 'module' object has no attribute 'fork'

问题是如何在Windows下运行包含对os.fork()的调用的脚本?我不介意使用一些只模拟行为且运行速度较慢的东西进行测试。我也希望不要更改脚本,因为它是第三方模块。

为了让您有更广泛的视角,我正在尝试在Windows上使用模块rq(也称为redis队列)。最终,我将在Heroku服务器上运行代码,该服务器是Linux机器,但在开发Web应用程序时我使用的是Windows。


1
如果你计划在Linux上部署,那么在Linux上开发会更容易。如果你不能或不想安装Linux,则至少在Windows电脑上安装Cygwin,这将允许你安装支持os.fork()的Python版本。 - Aya
@Aya - 这听起来很简单,但我不确定如何将整个 'heroku'、'git'、'foreman'、'virtualenv' 移动到使用不同的 Python 版本。这有多容易?你能详细说明一下吗? - zenpoy
@zenpoy 这里的“版本”并不是指不同的版本号,而是指不同的构建。为Cygwin构建的Python很可能可以与Heroku、Git等完美地配合使用。唯一的问题是,考虑到您对Cygwin缺乏经验,在这样的设置中会遇到多少其他问题。 - user4815162342
@zenpoy 好的,你可能需要调整你的 PATH 环境变量使它选择正确的版本,比如 C:\cygwin\bin\python.exe 而不是 C:\Program Files\Python\python.exe - Aya
3个回答

12

在没有fork()的系统上(例如Windows),模拟它并不容易。如果代码仅使用fork()exec启动一个新进程,您可以将其移植为使用subprocess。但是在rq中,似乎不是这种情况,因此有几个选项:

  1. rq移植到Windows,或要求别人为您完成。调用fork()的部分最简单的移植方式可能是使用multiprocessing模块。但是,您仍需要替换其他依赖于Unix的代码部分,例如timeouts模块中使用的signal.alarm()

  2. 在Cygwin下使用Python,它会模拟完全功能(虽然速度较慢)的fork(),因此Cygwin Python具有工作的os.fork()。请注意,要获得os.fork(),您需要使用由Cygwin构建的Python,例如Cygwin提供的那个Python,并且不能简单地在Cygwin下运行普通的Windows Python。

  3. 在虚拟机中的Linux上测试应用程序。

在这些不幸的选项中,我建议选择最后一个。


1
在Windows上,您可以安装带有Python的Cygwin。这个Python安装将具有os模块,支持os.fork()函数调用。

-1

导入一个包装器,它有条件地将适当的子进程调用封装在名为fork的函数中,并将其添加到os命名空间中。

可能最好的选择是联系供应商并指出os.fork不是您首选的选项。


我已经打开了一个问题。现在我正在尝试解决它。 - zenpoy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接