Matlab-python-freecad接口问题:Matlab在system()调用期间引发错误,其中终端对于同一调用没有此类错误

时间:2019-06-11 05:45:33

标签: python matlab interface ubuntu-16.04 freecad

我想要一个由现有的MATLAB脚本生成的对象,该对象以FreeCAD建模。有关Intro,Matlab代码,python代码,通过终端进行测试,Matlab错误,Notes(操作系统,版本)的重要内容,请参见粗体标题。

简介

我已经解决了流程的各个方面,但是在通过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中文件名的定义。在这种情况下,我应该看到'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->这可能是问题所在吗?对于我的特定FreeCAD安装,Python 2似乎是默认语言。
  • FreeCAD 0.18.1

修改

在我本人和我的主管进行了大量搜索之后,看来这可以归结为二进制文件之间的冲突。

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

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

我将继续进行调查。

1 个答案:

答案 0 :(得分:0)

回答我自己的问题!

在搜索之后,我编辑了问题:

  

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 < / p>

  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/';