【问题标题】:How to embed FreeCAD in a Python virtual environment?如何在 Python 虚拟环境中嵌入 FreeCAD?
【发布时间】:2021-07-23 07:07:09
【问题描述】:

如何设置一个嵌入了 FreeCAD 库的 Python 虚拟环境,以便能够作为模块导入脚本?

在处理使用 FreeCAD 库创建和修改 3D 几何图形的 Python 脚本时,我想避免使用 FreeCAD GUI 以及依赖于在系统上安装 FreeCAD。我希望 Python 虚拟环境可以做到这一点。

我在 Debian 10 的 virtualenv 中使用 Python 3.8 在 PyCharm 2021.1.1 中工作。

我开始使用 FreeCAD 文档作为嵌入脚本的基础:

https://wiki.freecadweb.org/Embedding_FreeCAD

在一次尝试中,我从 Debian 下载并解压了 .deb 包,注意获取每个依赖项所需的正确版本。在另一次尝试中,我复制了 FreeCAD flatpak 安装的内容,因为它应该包含 FreeCAD 依赖的所有库。

在将要导入的库放入虚拟机加工文件夹后,我在各种尝试中使用 sys.path.append() 以及 PyCharm 的项目结构工具指向它们。在这两种情况下,虚拟环境都会检测到 FreeCAD.so 所在的位置,但无法找到其任何依赖项,即使位于同一文件夹中也是如此。显式导入这些依赖项时,它们中的每一个都有相同的问题。这在导入失败时会导致死胡同,因为它没有根据 Python 定义模块导出函数:

ImportError: dynamic module does not define module export function (PyInit_libnghttp2)

我似乎正在查看一个很长的依赖关系链,即使我提供了所需的库并通知 Python 它们所在的位置。

我将不胜感激有关如何执行此操作的直接说明或指向描述在 Python 虚拟环境中导入 FreeCAD 库的文档的指针,因为我还没有遇到任何具体的内容。

我遇到了一些先前的问题,它们似乎具有相似的意图,但没有答案:

Embedding FreeCAD in python script

Is it possible to embed Blender/Freecad in a python program?

Conda 的类似问题集中在从主机系统导入库而不是将它们嵌入到虚拟环境中:

Incude FreeCAD in system path for just one conda virtual environment

其他人在 FreeCAD 论坛上的问题没有得到解答:

https://forum.freecadweb.org/viewtopic.php?t=27929

编辑:

弄清楚这一点是一次很棒的学习经历。将依赖项拼凑在一起的问题在于,要实现这种方法,从 FreeCAD 及其依赖项到 Python 解释器及其依赖项的所有内容似乎都需要构建在它们所依赖的相同版本的库上,以避免导致分段使一切都陷入崩溃的故障。这意味着从 Flatpak 安装中获取它所依赖的 FreeCAD 模块和库的想法在理论上并不可怕,因为所有部件都是使用相同的库版本构建在一起的。我只是无法解决问题,大概是由于包含的库的位置以及难以识别包含的 Python 解释器的可执行文件。最后,我查看了 FreeCAD AppImage 的内容,结果发现文件夹结构中包含所需的所有内容,这似乎对 PyCharm 和 Python 对模块和库的期望非常友好。

【问题讨论】:

    标签: python-3.x pycharm debian virtualenv freecad


    【解决方案1】:

    这是我为让 FreeCAD 与 PyCharm 和 virtualenv 一起工作所做的:

    下载 FreeCAD AppImage

    https://www.freecadweb.org/downloads.php

    使 AppImage 可执行

    chmod -v +x ~/Downloads/FreeCAD_*.AppImage
    

    创建用于提取 AppImage 的文件夹

    mkdir -v ~/Documents/freecad_appimage
    

    从文件夹中提取 AppImage(注意:这会扩展为接近 30000 个文件,需要超过 2 GB 的磁盘空间)

    cd ~/Documents/freecad_appimage
    
    ~/Downloads/./FreeCAD_*.AppImage --appimage-extract 
    

    为 PyCharm 项目创建文件夹

    mkdir -v ~/Documents/pycharm_freecad_project
    

    使用 Python 解释器从提取的 AppImage 中创建 pycharm 项目

    Location: ~/Documents/pycharm_freecad_project
    New environment using: Virtualenv
    Location: ~/Documents/pycharm_freecad_project/venv
    Base interpreter: ~/Documents/freecad_appimage/squashfs-root/usr/bin/python
    Inherit global site-packages: False
    Make available to all projects: False
    

    将包含 FreeCAD.so 库的文件夹作为 Content Root 添加到 PyCharm 项目结构并标记为 Sources(这样做,您不必设置 PYTHONPATH 或 sys.path 值,因为 PyCharm 向解释器提供模块位置信息)

    File: Settings: Project: Project Structure: Add Content Root
    ~/Documents/freecad_appimage/squashfs-root/usr/lib
    

    在此 PyCharm 忙于索引文件一段时间之后。

    在 PyCharm 中打开 Python 控制台并运行命令以检查基本功能

    import FreeCAD
    

    使用示例功能创建 python 脚本

    import FreeCAD
    vec = FreeCAD.Base.Vector(0, 0, 0)
    print(vec)
    

    运行脚本

    调试脚本

    到目前为止,我在脚本中使用的所有 FreeCAD 功能都有效。但是,一个问题似乎是 FreeCAD 模块需要在 Path 模块之前导入。否则,Python 解释器会以代码 139 退出(被信号 11:SIGSEGV 中断)。

    PyCharm 有几个问题:它在导入名称下方显示一条红色波浪线,并声称发生错误,因为“没有名为‘FreeCAD’的模块”,即使脚本运行良好。此外,PyCharm 无法在代码视图中提供代码完成,即使它设法在其 Python 控制台中完成。我正在创建新问题来解决这些问题,如果找到解决方案,我会在此处更新信息。

    【讨论】:

    • 效果很好!谢谢。代码完成问题有什么进展吗?干杯,--唐
    • 很遗憾没有进展。在撰写新问题时,我陷入了研究该主题的困境,但由于棘手的问题导致进展缓慢而感到沮丧,并决定在没有该功能的情况下继续工作。不过会很棒,所以如果你有线索,它会对答案有很大的改进:)
    猜你喜欢
    • 2012-02-18
    • 2016-02-20
    • 1970-01-01
    • 2019-04-28
    • 2019-11-16
    • 2017-01-09
    • 1970-01-01
    • 2019-12-23
    • 2019-09-24
    相关资源
    最近更新 更多