Blender Python `bpy` `__init__.py`,显然是从一个不存在的模块 `_bpy` 导入的

Blender Python `bpy` `__init__.py`, apparently importing from a non-existent module `_bpy`

我正在使用 Mac OS X 与 PyCharm 和 Python 3.5.1 和 Blender 2.77。

我将 Blender 与 Python 脚本一起使用。我知道为了 运行 Python 使用 Blender 的脚本(即导入 bpy),我需要使用 blender -b -P /path/to/my_python_script.py 从命令行 运行 它(虽然我真的不知道为什么)。这一切都很好并且可以工作,但我希望我可以从 Python 内部 运行 它,因为我将这些脚本与其他非 Blender Python 代码一起使用并且我喜欢使用 PyCharm 来调试和做几乎所有的事情。我知道我不能只 运行 来自 PyCharm 的 Blender Python 脚本,但我想我还是会尝试。我通过编辑 "Preferences" 中的 "Project Structure" 设置以包含 bpy 模块所在的父目录,确保 PyCharm 可以看到 bpy 模块,在我的机器上是 /Applications/blender.app/Contents/Resources/2.77/scripts/modules。但是,当我尝试 运行 脚本时,它给出了 ImportError: No module named '_bpy'。我跟踪了错误的来源,罪魁祸首是 bpy 模块(其在我机器上的位置是 /Applications/blender.app/Contents/Resources/2.77/scripts/modules/bpy/__init__.py)中的 __init__.py 文件中的一行;该行是:

from _bpy import types, props, app, data, context

所以我试图在我的机器上搜索模块 _bpy,但在任何地方都找不到。所以它似乎是从一个不存在的模块中导入东西。但是,我知道我的脚本可以工作,因为我已经在 Blender 中成功 运行 它。

所以我的问题是,我和 PyCharm 都找不到但 Blender 应用程序没有问题的神秘 _bpy 模块到底发生了什么巫术?我希望对这里可能发生的事情有一个大致的了解,因此欢迎进行有根据的猜测(以及显然的精确答案)。

你有没有注意到 line before from _bpy import... 上面写着 # internal blender C module 这应该是赠品。

witchcraft 使此工作起作用的是 blender 二进制文件包含 _bpy 作为二进制 python 模块,blender 使此模块可在 python 解释器包含在 blender 中,它在 python 解释器的初始化期间执行此操作。正常的 blender 二进制文件不能导入到 blender 之外的 python 解释器中,除非被构建到 Python 模块中(见下文)。

要了解如何操作,您可以从 Python's c-api. You may also want to look through blender's source code within source/blender/python 上的 Python 文档开始,您可以在其中找到用于构建 blender 主要基于 C 的模块(例如 bpy、bgl、 bmesh, mathutils.

另见 which has a link to info on building blender as a Python module so it can be imported (without the gui) into an external Python interpreter. If you search for pycharm at blender.stackexchange.com 你会找到关于在 pycharm 和 eclipse 中使用 bpy 的几个答案,包括将 blender 运行 作为外部解释器进行调试的方法。