我想要一个由现有的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是否会对它正在处理的文件做一些解释?
注释
修改
在我本人和我的主管进行了大量搜索之后,看来这可以归结为二进制文件之间的冲突。
MATLAB在 / bin / glnxa64 / 和另一个工具箱文件夹中定义了 libxerces-c.so 文件。
这些可能与linux二进制文件 /usr/lib/x86_64-linux-gnu/libxerces-c.so 冲突,因此,当终端通过matlab调用时,它将使用matlab二进制文件代替系统二进制文件。
我将继续进行调查。
答案 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时,路径都会被编辑,然后恢复为原始格式。
解决方案:
重要的第一步: oldpath = getenv(“ LD_LIBRARY_PATH”)获取并保存当前路径的一些记录。对我来说,这是万一 问题或冲突稍后出现。
然后我删除了路径'/ usr / local / MATLAB / R2018b / bin / glnxa64 /'中的部分,并将字符串保存到 newpath < / p>
然后我将其设置为新路径: 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/';