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

Я хочу, чтобы объект, сгенерированный существующим сценарием 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")

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

Итак, в сущности, я должен получить распечатку определения 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
  • MATLAB 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 вместо двоичный файл системы.

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

1 Ответ

0 голосов
/ 12 июня 2019

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

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

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