Python、Windows 和多重处理

2024-01-07

我有一个最初在 Linux 上构建的 Python 程序,现在我正尝试将其移植到 Windows。我在包含所有依赖项的虚拟环境中运行该程序(我的程序使用 pip install --find-linkswheelsmy_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 中的分叉意外提前终止引起的,其中真正的错误是无法导入 OtherCustomClass。我已经确认 OtherCustomClass 存在于 venv/lib/site-packages 中的 base_module 文件夹中,并且当我首先启动模块时不会发生此错误,因为 Python 永远不会到达 main() 或中的指令init如果脚本无法编译。

我做了一些研究,我知道这个问题已经困扰了其他人(通常使用第三方库,他们修复了问题而没有发布解决方案)。这似乎可以追溯到 Windows 缺少 fork(),以及 python 在 Windows 上对多处理的处理 - 另请参阅http://docs.python.org/library/multiprocessing.html#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包,因此隐式导入失败,但这只是猜测。

注意无论如何你不应该使用隐式相对导入 http://legacy.python.org/dev/peps/pep-0008/#imports(它们已从 Python 3 中完全删除),因此切换到绝对导入并不是一件坏事。

另外值得注意的是,做一个explicit相对导入适用于 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python、Windows 和多重处理 的相关文章

随机推荐

  • Android代码不扫描BLE设备CC2650

    我正在使用 CC2650STK SensorTag 我从 GitHub 下载了这个开源应用程序 https github com googlesamples android BluetoothLeGatt https github com
  • 如何正确调整 Facebook Canvas 应用程序 (iFrame) 的大小?

    我需要在更新页面内容后调整画布大小 我可以明确地做到这一点 FB Canvas setSize width 760 height 1480 但是 如果没有参数 它就无法工作 即 setSize 另外 我可以通过以下方式调整高度 FB Can
  • 保留 IBOutlet 视图元素真的是最佳实践吗?

    我不断遇到 UIViewControllers 包含大量 IBOutlet 将控制器连接到其视图的子视图 通常是 UILabels 的情况 遵循 最佳实践 即在所有 UI 元素上使用保留 property retain nonatomic
  • SQL 中的大文本和图像

    在 SQL 数据库中存储大量文本 例如 html 页面 是个好主意吗 或者将其作为 html 文件存储在文件系统中是一个更好的主意吗 图像也是如此 将图像数据存储在数据库中是一个好主意还是将它们放在磁盘上更好 例如 存储大量数据是否会导致性
  • 应用程序更新后推送通知令牌是否会更改?

    我问的是两种情况 1 我们从 App Store 进行定期更新后 2 在我们模拟更新后 通过从商店下载当前版本并从 Xcode 中安装和运行新版本 推送通知令牌会改变吗 如果改变 多久改变一次 例如 每次 还是时不时 我问这个 因为我正在做
  • 运行 pod install 时出现“您的项目未明确指定 CocoaPods 主规范存储库”警告

    我跑完之后pod install 我收到一条警告 您的项目没有明确指定 CocoaPods 主规范存储库 由于 CDN 现在被用作默认值 您可以通过以下方式安全地将其从存储库目录中删除 pod repo remove master 要抑制此
  • 为什么 Passport 不能与 cookieSession() 一起使用?

    我正在研究 facebook 授权 发现护照不能与 cookieSession 一起使用 只能与 session 一起使用 在第一种情况下 req user 始终未定义 有可能让它发挥作用吗 您仍然可以使用最新版本的 Express 重现此
  • NPOI - 写入文件会损坏 .xlsx 工作簿

    我有一段代码当前正在写入 xls工作簿 HSSFWorkbook 没有问题 但是 当我尝试使用相同的代码写入 xlsx工作簿 XSSFWorkbook 存档已损坏并且无法在 Excel 中打开 以下代码是我用来访问工作簿 编辑工作簿 然后保
  • 如何禁用下拉元素中的特定项目

    如何使用 jQuery 或 JavaScript 禁用下拉元素的某些项目 与禁用任何其他 HTML 元素相同的方式 使用 option selector prop disabled true 看到它在action http jsfiddle
  • Libgdx box2D 中的碰撞对于某些物体失败

    我正在使用 libgdx 和 box2d 开发我的第一个游戏 我正在使用调试渲染器来测试我的对象 我创建了一些类似汽车的物体 每辆车都有一个主体 它是一个6点的大多边形 长约1米 高0 7米 并有2个通过旋转关节连接的车轮 主车还通过旋转接
  • GDI+ LockBits()/UnLockBits() 异常

    我的程序是用 C 编写的 并在低级别上使用位图进行操作 一切工作正常 但有时 非常罕见 但稳定 会发生异常 通用 GDI 异常 并且很难重现这种情况 函数 LockBits 和 UnLockBits 发生异常 它包含错误代码 2147467
  • 如何在 QML 中捕获信号?

    如何将信号从一个 qml 组件发送到另一个 下面是一个例子 Rectangle id main width 360 height 360 signal clicked Text id testStr anchors centerIn par
  • Ingress 不转发请求 - 适用于 Windows 和 kubernetes 的 Docker 桌面

    EDIT 我删除了 minikube 在 Windows 的 Docker 桌面中启用了 kubernetes 并安装ingress nginx手动 helm upgrade install ingress nginx ingress ng
  • 使用powershell和svn删除未版本控制的文件

    我正在尝试编写一个构建脚本来使用 Powershell 签出代码 我需要能够使用 SVN 存储库中的适当更改来替换对工作副本所做的任何修改 这还包括删除在存储库中删除但未在工作副本中删除的所有文件 不幸的是 我无法进行干净的签出 因为每次运
  • Xdebug 3 docker mac PhpStorm 损坏的管道

    I see There was a problem sending 179 bytes on socket 11 Broken pipe 在 xdebug log 中看不到原因 这几天一直在兜圈子 尝试各种东西 我究竟做错了什么 X调试3
  • HTML 中的绝对路径不起作用

    我正在尝试使用小型 JavaScript 代码构建 HTML 模板 这是内容 在根目录下 我构建了两个文件 索引 html
  • 检查密码强度的最佳方法是什么?

    确保用户提供的密码是注册或更改密码表单中的强密码的最佳方法是什么 我的一个想法 用Python def validate password passwd conditions met 0 conditions total 3 if len
  • PK在深色模式和浅色模式下绘制不同的结果

    使用时PKDrawing在暗模式下生成的图像图像来自矩形 比例 https developer apple com documentation pencilkit pkdrawing 3237277 imagefromrect返回白色的钢笔
  • WPF 异步任务 阻塞 UI

    我已经与Task类型 一切都很好Task什么也不返回 例如 XAML
  • Python、Windows 和多重处理

    我有一个最初在 Linux 上构建的 Python 程序 现在我正尝试将其移植到 Windows 我在包含所有依赖项的虚拟环境中运行该程序 我的程序使用 pip install find linkswheelsmy module 作为轮子安