0

我想要一个对象,由现有的 MATLAB 脚本生成,在 FreeCAD 中建模。介绍的重要内容见粗体标题,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 中打印出文件名的定义。在这种情况下,我应该看到'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 安装的默认语言。
  • 自由CAD 0.18.1

编辑

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

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

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

我将继续进一步调查。

4

1 回答 1

0

回答我自己的问题!

编辑 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/';
于 2019-06-12T06:46:59.860 回答