【问题标题】:Matlab-python-freecad interface problem: Matlab throws error during system() call where terminal has no such error for same callMatlab-python-freecad 接口问题:Matlab 在 system() 调用期间抛出错误,而终端对于相同的调用没有此类错误
【发布时间】:2019-10-25 11:49:24
【问题描述】:

我想要一个由现有 MATLAB 脚本生成并在 FreeCAD 中建模的对象。 Intro、Matlab 代码、python 代码、通过终端测试、Matlab 错误、注释(操作系统、版本)的重要内容见粗体标题

简介

我已经解决了流程的每一方面,但我在通过 MATLAB 调用 python 脚本时遇到了问题。

我既有对象构造函数,又有一个在 FreeCAD 中构建东西的脚本;所以本质上,我有任何一端。我现在需要的是连接它们。

我的测试是基本的,但应该已经足够了,或者我认为是这样。

Matlab:

pyfile              = '~/Desktop/FreeCADworkspace/testvec2.py';
filename            = 'atestname';
call                = "python " + pyfile + " " + filename;
[status,result]     = system("sh ~/Desktop/FreeCADworkspace/freecad.sh")

Python:

#   Import python roots
import sys
import os
sys.path.append('/usr/lib/freecad-python2/lib')
sys.path.append('/usr/lib/freecad/lib')
#   Other imports
import numpy as np
import math

#   Import FreeCAD and parts
import FreeCAD 
from FreeCAD import Base
import Part, Sketcher, Draft

try: 
    filename    = sys.argv[1]
except: # this should never be thrown, exists for testing and other integration
    print('No arguments called into script.')
    print('Please use format: python thisScript.py arg_filename')
    quit() # exit script

print(filename) # checkmeplz

所以,基本上应该发生的是,我应该在 MATLAB 中打印出 filename 的定义。在这种情况下,我应该看到 'atestname'

测试

如果我通过终端调用它:

python ~/Desktop/FreeCADworkspace/testvec2.py atestname

我明白了:

FreeCAD 0.18.1, Libs: 0.18.1R
atestname

这完全符合预期。我的 MATLAB 也不能这样说

MATLAB 错误

Traceback (most recent call last):
       File "/home/ashaiden/Desktop/FreeCADworkspace/testvec2.py", line 11, in <module>
         import FreeCAD # no FreeCADGui??
     ImportError: /usr/lib/freecad-python2/lib/libFreeCADBase.so: undefined symbol: _ZN11xercesc_3_111InputSource11setEncodingEPKt

我还尝试通过 bash 脚本从 MATLAB 执行 python 脚本。同样的错误。

让我感到困惑的是:为什么某些通过终端完美执行的命令在通过 MATLAB 调用时会失败? 我觉得我误解了 MATLAB 系统调用的执行方式。我假设调用是发送到操作系统本身并由操作系统本身处理的。但是在这种情况下,出错是没有意义的。 MATLAB 是否对其正在处理的文件进行一些解释?

备注

  • 操作系统:Ubuntu 16.04
  • MATLAB 2018b
  • Python 2.7 -> 这可能是问题吗? Python 2 似乎是我的特定 FreeCAD 安装的默认语言。
  • FreeCAD 0.18.1

编辑

经过我和我的主管多次搜索,这似乎可以归结为二进制文件之间的冲突。

MATLAB 在 /bin/glnxa64/ 和另一个工具箱文件夹中定义了 libxerces-c.so 文件。

这些可能与 linux 二进制文件 /usr/lib/x86_64-linux-gnu/libxerces-c.so 冲突,因此当通过 matlab 调用终端时,它会使用 matlab 二进制文件系统二进制文件。

我将继续进一步调查。

【问题讨论】:

    标签: python matlab interface ubuntu-16.04 freecad


    【解决方案1】:

    回答我自己的问题!

    Edit 30/7 : 这实际上并不能充分解决 linux 的问题,因为机器之间的路径可能会有一些细微差别。它也不能解决mac或windows的问题(问题确实发生在mac上,但如果它发生在windows上我没有数据。

    经过挖掘和搜索,我编辑了问题:

    MATLAB 在 /bin/glnxa64/ 中定义了 libxerces-c.so 文件,并且 另一个工具箱文件夹。

    这些可能与 linux 二进制文件冲突 /usr/lib/x86_64-linux-gnu/libxerces-c.so 这样当终端是 通过 matlab 调用,它使用 matlab 二进制文件而不是系统 二进制。

    我是正确的,这是由于 MATLAB 的 bin libxerces-c.so 和 linux 本机 libxerces-c.so 之间的冲突。我至少找到了部分解决方法。我不知道它的稳健性。在最坏的情况下,每次在我的代码中调用 FreeCAD 时,路径都会被编辑然后返回到原始格式(粗略)。

    解决方案:

    1. 重要的第一步: oldpath = getenv("LD_LIBRARY_PATH") 获取并保存当前路径的一些记录。这对我来说,以防万一 问题或冲突稍后出现。

    2. 然后我删除了路径 '/usr/local/MATLAB/R2018b/bin/glnxa64/' 的部分并将字符串保存到 newpath

    3. 然后我将其设为新路径:setenv("LD_LIBRARY_PATH", newpath), 其中 newpath 不再有对冲突的引用 文件夹

    现在我在我的 MATLAB 命令窗口中得到了预期的结果:

    FreeCAD 0.18.1, Libs: 0.18.1R
    
    atestname
    

    比较路径:

    Newpath =  '/usr/local/MATLAB/R2018b/sys/opengl/lib/glnxa64:/usr/local/MATLAB/R2018b/sys/os/glnxa64:/usr/local/MATLAB/R2018b/extern/lib/glnxa64:/usr/local/MATLAB/R2018b/runtime/glnxa64:/usr/local/MATLAB/R2018b/sys/java/jre/glnxa64/jre/lib/amd64/native_threads:/usr/local/MATLAB/R2018b/sys/java/jre/glnxa64/jre/lib/amd64/server:/usr/lib/x86_64-linux-gnu/';
    
    Oldpath =  '/usr/local/MATLAB/R2018b/sys/opengl/lib/glnxa64:/usr/local/MATLAB/R2018b/sys/os/glnxa64:/usr/local/MATLAB/R2018b/bin/glnxa64:/usr/local/MATLAB/R2018b/extern/lib/glnxa64:/usr/local/MATLAB/R2018b/runtime/glnxa64:/usr/local/MATLAB/R2018b/sys/java/jre/glnxa64/jre/lib/amd64/native_threads:/usr/local/MATLAB/R2018b/sys/java/jre/glnxa64/jre/lib/amd64/server:/usr/lib/x86_64-linux-gnu/';
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多