Проблема с интерфейсом Matlab-python-freecad: Matlab выдает ошибку во время вызова system(), где терминал не имеет такой ошибки для того же вызова

Я хочу иметь объект, сгенерированный существующим скриптом MATLAB, смоделированный в FreeCAD. См. выделенные полужирным шрифтом заголовки для важного содержания Intro, кода Matlab, кода python, тестирования через терминал, ошибки Matlab, примечаний (ОС, версии)

Введение

Я проработал каждую сторону процесса, но у меня возникли проблемы с вызовом скрипта Python через MATLAB.

У меня есть и конструктор объектов, и скрипт, который работает при создании вещей в FreeCAD; так по существу, у меня есть любой конец. Что мне сейчас нужно, так это связать их.

Мой тест базовый, но его должно было быть достаточно, по крайней мере, я так предполагал.

Matlab:

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

Питон:

#   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

Итак, по сути, что должно произойти, так это то, что я должен получить распечатку определения filename в 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

Я также пытался выполнить скрипт python из MATLAB через скрипт bash. Та же ошибка.

Что меня смущает: почему какая-то команда, которая отлично выполняется через терминал, не работает при вызове через MATLAB? Я чувствую, что неправильно понимаю, как выполняются системные вызовы MATLAB. Я предположил, что вызов был отправлен и обработан самой ОС. Но в этом случае не было бы смысла получать ошибку. Выполняет ли MATLAB интерпретацию обрабатываемых файлов?

Примечания

  • Операционная система: Ubuntu 16.04
  • МАТЛАБ 2018b
  • Python 2.7 -> это потенциально проблема? Python 2, похоже, был языком по умолчанию для моей конкретной установки FreeCAD.
  • FreeCAD 0.18.1

Изменить

После долгих поисков, проведенных мной и моим руководителем, оказалось, что это можно объяснить конфликтом между двоичными файлами.

В MATLAB есть файлы libxerces-c.so, определенные внутри /bin/glnxa64/ и еще одна папка панели инструментов.

Они могут конфликтовать с бинарным файлом Linux /usr/lib/x86_64-linux-gnu/libxerces-c.so, так что когда терминал вызывается через Matlab, он использует бинарный файл Matlab вместо системы. двоичный.

Я продолжу расследование дальше.


person killing_vector    schedule 11.06.2019    source источник


Ответы (1)


Отвечаю на свои вопросы!

Редактировать 30/7: На самом деле это не решает проблему адекватно для Linux, учитывая, что пути могут немного различаться между машинами. Это также не решает проблему для Mac или Windows (проблема возникает на Mac, но у меня нет данных, возникает ли она на Windows.

После копания и поиска я отредактировал вопрос:

В MATLAB есть файлы libxerces-c.so, определенные внутри /bin/glnxa64/ и в другой папке панели инструментов.

Они могут конфликтовать с бинарным файлом linux /usr/lib/x86_64-linux-gnu/libxerces-c.so, поэтому, когда терминал вызывается через Matlab, он использует двоичный файл Matlab вместо системного двоичного файла.

Я был прав, что это произошло из-за конфликта между бином MATLAB 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/';
person killing_vector    schedule 12.06.2019