使用多处理池时的 Pycharm 调试器

问题描述 投票:0回答:4

我的问题出在这个设置上:

  • Pycharm 2020.3 专业版
  • multiprocessing.Pool
  • Macbook pro 2020 (M1)
  • 康达蟒蛇 3.8

最重要的是,它发生在我使用 pycharm 的调试器时。

它在控制台中显示 8 次(进程数):

Error loading: /Applications/PyCharm.app/Contents/plugins/python/helpers/pydev/pydevd_attach_to_process/attach_x86_64.dylib

每个进程都被执行。结果正确。我可以用 htop 命令看到它们。所以这只是调试器故障,并不会真正影响代码执行(如果我错了请纠正我)。

这是我运行的那种代码:

def func(x):
    return x+10


if __name__ == '__main__':
    poo = Pool()
    x = [[i] for i in range(10)]
    res = poo.starmap(func, x)
    print(res)

我现在可以忽略控制台中的大量打印,但这并不是很方便。如果有人有想法摆脱那些......

python macos pycharm multiprocessing conda
4个回答
4
投票

这听起来像是 JetBrains 开发人员需要为 M1 解决的问题(考虑向他们提交错误报告)。与此同时,我怀疑你可以在选项下禁用它:

PyCharm > 首选项 > 构建、执行、部署 > Python 调试器

并取消选中“调试时自动附加到子进程”框。请参阅相关文档以供参考。


2
投票

该错误的解决方案是修改文件 /Applications/PyCharm.app/Contents/plugins/python/helpers/pydev/pydevd_attach_to_process/linux_and_mac/compile_mac.sh 并替换下一个的所有代码:

g++ -fPIC -D_REENTRANT -std=c++11 -arch arm64 -c -o attach_x86_64.o attach.cpp
g++ -dynamiclib -nostartfiles -arch arm64 -o attach_x86_64.dylib attach_x86_64.o -lc
rm attach_x86_64.o
mv attach_x86_64.dylib ../attach_x86_64.dylib

然后你可以运行sh脚本,它将替换

attach_x86_64.dylib
文件。

注意。如果您更新 pycharm,此更改将丢失。


1
投票

仅当我将 pycharm 更新为较新版本时,我才在我的 Mac M1 16" (2021) 上遇到了同样的问题。 如果您在 Mac M1 笔记本电脑上遇到此问题。请使用笔记本电脑前往此位置

/Applications/PyCharm CE.app/Contents/plugins/python-ce/helpers/pydev/pydevd_attach_to_process/linux_and_mac/compile_mac.sh

并将这些行添加到具有现有行的

compile_mac.sh
文件中。

g++ -fPIC -D_REENTRANT -std=c++11 -arch arm64 -c -o attach_arm64.o attach.cpp
g++ -dynamiclib -nostartfiles -arch arm64 -o attach_arm64.dylib attach_arm64.o -lc
rm attach_arm64.o
mv attach_arm64.dylib ../attach_arm64.dylib

我发现这个链接对解决这个问题很有用:youtrack.jetbrains.com


0
投票

我不知道它是否会完全起作用,但我想我找到了解决此错误的方法。首先,你需要在文件

_PyObject_FastCallDict
中将动态加载函数的名称
PyObject_VectorcallDict
更改为
/Applications/PyCharm.app/Contents/plugins/python/helpers/pydev/pydevd/attach_to_process/common/py_utils.hpp
。你应该更换字符串

DEFINE_PROC(pyObject_FastCallDict, _PyObject_FastCallDict*, "_PyObject_FastCallDict", 530);

DEFINE_PROC(pyObject_FastCallDict, _PyObject_FastCallDict*, "PyObject_VectorcallDict", 530);

然后你应该将文件

/Applications/PyCharm.app/Contents/plugins/python/helpers/pydev/pydevd_attach_to_process/linux_and_mac/compile_mac.sh
的内容替换为以下内容:

g++ -fPIC -D_REENTRANT -std=c++11 -arch arm64 -c -o attach_x86_64.o attach.cpp
g++ -dynamiclib -nostartfiles -arch arm64 -o attach_x86_64.dylib attach_x86_64.o -lc
rm attach_x86_64.o
mv attach_x86_64.dylib ../attach_x86_64.dylib

脚本执行后

attach_arm64.dylib
成功运行并且
pydev
没有显示任何错误消息。 我没有尝试所有情况,但 FastApi 应用程序中的断点有效并且调试器显示线程。

© www.soinside.com 2019 - 2024. All rights reserved.