gpt4 book ai didi

Python、Windows 和多处理

转载 作者:可可西里 更新时间:2023-11-01 14:18:16 24 4
gpt4 key购买 nike

我有一个最初在 Linux 上构建并为 Linux 构建的 Python 程序,我现在正试图将其移植到 Windows。我在包含所有依赖项的虚拟环境中运行程序(我的程序安装为带有 pip install --find-links wheels my_module 的轮子)。该程序启动了

(venv) C:\>venv\Scripts\python.exe -m base_module.Launcher arg1 arg2

base_module 按照提供的参数解释加载我的模块,他的相关代码是:

from multiprocessing.managers import SyncManager
import OtherCustomClass

class BaseModule(object):
def __init__(self, arg1, arg2):
self.manager = SyncManager()
self.manager.start(ignore_interrupt)

def main(argv=None):
ret = -1
try:
basmod = BaseModule(argv[0], argv[1])
ret = basmod.run()
except Exception, err:
print("error: " + str(err))
print(traceback.format_exc())
return ret

if __name__ == "__main__":
exitCode = main(sys.argv[1:])
sys.exit(exitCode)

这在 Linux 上运行良好,但在 Windows 上出现以下异常:

Traceback (most recent call last):
File "<string>", line 1, in <module>
File "C:\Python27\Lib\multiprocessing\forking.py", line 380, in main
prepare(preparation_data)
File "C:\Python27\Lib\multiprocessing\forking.py", line 505, in prepare
'__parents_main__', file, path_name, etc
File "build/bdist.linux-x86_64/egg/base_module/BaseModule.py", line 2, in <module>
ImportError: No module named OtherCustomClass
exception in main:
Traceback (most recent call last):
File "build/bdist.linux-x86_64/egg/base_module/BaseModule.py", line 12, in main
File "build/bdist.linux-x86_64/egg/base_module/BaseModule.py", line 7, in __init__
File "C:\Python27\Lib\multiprocessing\managers.py", line 528, in start
self._address = reader.recv()
EOFError

后一个 EOFError 是由 SyncManager 中的 fork 意外提前终止引起的,其中真正的错误是无法导入 OtherCustomClass。我已经确认 OtherCustomClass 存在于 venv/lib/site-packages 中的 base_module 文件夹中,并且当我首先启动模块时不会发生此错误,因为 Python 永远不会到达 main() 或 init 如果脚本无法编译。

我做了一些研究,我知道这个问题已经影响到其他人(通常使用第三方库,他们在没有发布解决方案的情况下解决了这个问题)。它似乎可以追溯到 Windows 缺少 fork(),以及 python 在 Windows 上处理多进程 - 另请参见 http://docs.python.org/library/multiprocessing.html#windows .但我不知道如何解决这个问题。

这是最新的 Python 2.7 分支 (2.7.8),在 Windows 7 x64 上运行。

最佳答案

您可以通过对 OtherCustomClass 使用绝对导入来解决此问题:

from base_module import OtherCustomClass

我不太清楚为什么,但似乎当 multiprocessing 生成一个新进程并导入你的 __main__ 时,它无法处理你的隐式相对导入与 OtherCustomClass 一起使用。如果您从 base_module 显式导入它,它工作正常。我的猜测是生成的子进程未被识别为 base_module 包的一部分,因此隐式导入失败,但这只是一个猜测。

请注意 you shouldn't be using implicit relative imports anyway (它们已从 Python 3 中完全删除),因此切换到绝对导入并不是一件坏事。

另请注意,显式相对导入适用于 Python 3.4:

from . import OtherCustomClass

但它在 Python 2.7 上失败了:

Traceback (most recent call last):
File "<string>", line 1, in <module>
File "C:\python27\lib\multiprocessing\forking.py", line 380, in main
prepare(preparation_data)
File "C:\python27\lib\multiprocessing\forking.py", line 495, in prepare
'__parents_main__', file, path_name, etc
File "C:\Users\oreild1\Desktop\base_module\Launcher.py", line 5, in <module>
from . import OtherCustomClass
ValueError: Attempted relative import in non-package
error:
Traceback (most recent call last):
File "C:\Users\oreild1\Desktop\base_module\Launcher.py", line 18, in main
basmod = BaseModule(argv[0], argv[1])
File "C:\Users\oreild1\Desktop\base_module\Launcher.py", line 10, in __init__
self.manager.start()
File "C:\python27\lib\multiprocessing\managers.py", line 528, in start
self._address = reader.recv()
EOFError

关于Python、Windows 和多处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26041404/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com