Я столкнулся с проблемой, пытаясь присоединиться к некоторому коду из разных источников в Matlab, и я действительно не знаю, как подойти к нему. По сути, у меня есть некоторый код Python для алгоритма сжатия, вызванного из командной строки, который сам использует подпроцесс для запуска и связи с кодом C++, скомпилированным в двоичный файл.Подпроцесс Python, вызванный из Matlab, не работает
функция в Python (который является частью более крупного объекта) выглядит следующим образом:
def __extractRepeats(self, repeatClass):
process = subprocess.Popen(["./repeats1/repeats11", "-i", "-r"+repeatClass, "-n2", "-psol"],stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.STDOUT)
process.stdin.write(' '.join(map(str,self.__concatenatedDAG)))
text_file = ''
while process.poll() is None:
output = process.communicate()[0].rstrip()
text_file += output
process.wait()
repeats=[]
firstLine = False
for line in text_file.splitlines():
if firstLine == False:
firstLine = True
continue
repeats.append(line.rstrip('\n'))
return repeats
Для того, чтобы свести к минимуму проблемы портируемости, я решил сделать интеграцию с Matlab полностью косвенно через системную команду, поставив вместе сценарий со всеми компонентами и запустить его с помощью
system('./temp_script')
где temp_script исполняемые и выглядит следующим образом:
cd /home/ben/Documents/MATLAB/StructureDiscovery/+sd/Lexis
python Lexis.py -f i /home/ben/Documents/MATLAB/StructureDiscovery/+sd/Lexis/aabb.txt >> /home/ben/Documents/MATLAB/StructureDiscovery/+sd/Lexis/lexis_results.txt
Теперь я запускаю это в Ubuntu 16.04, где работает сценарий из терминала. Запуск же скрипт с Matlab, однако, дает мне ошибку
Traceback (most recent call last):
File "Lexis.py", line 762, in <module>
g.GLexis(quietLog, rFlag, functionFlag, costWeight)
File "Lexis.py", line 191, in GLexis
(maximumRepeatGainValue, selectedRepeatOccs) = self.__retreiveMaximumGainRepeat(normalRepeatType, CostFunction.EdgeCost)
File "Lexis.py", line 242, in __retreiveMaximumGainRepeat
repeats = self.__extractRepeats(repeatClass)
File "Lexis.py", line 302, in __extractRepeats
process.stdin.write(' '.join(map(str,self.__concatenatedDAG)))
IOError: [Errno 32] Broken pipe
или ошибку
File "Lexis.py", line 251, in __retreiveMaximumGainRepeat
idx = map(int,repeatStats[2][1:-1].split(','))[0]
ValueError: invalid literal for int() with base 10: 'ersio'
, и я не мог понять, когда я получаю, который один.
соответствующий фрагмент кода для repeatStats является
repeats = self.__extractRepeats(repeatClass)
for r in repeats: #Extracting maximum repeat
repeatStats = r.split()
idx = map(int,repeatStats[2][1:-1].split(','))[0]
Я действительно не знаю, что отличается от Matlab называя что-то через систему и вызывая его непосредственно с терминала, так что я не знаю, что происходит не так. В OSX 10.11 работает точно такой же код.
Кто-нибудь знает о внутренней работе системной команды Matlab и почему это может не позволить Python вызвать подпроцесс?
Любая помощь будет оценена!
Если подпроцесс работает правильно, repeatStats [2] представляет собой список (численных) индексов, в скобках. – serrapaladin
Можете ли вы попробовать удалить stdin = subprocess.PIPE? –
Это не удается, потому что тогда process.stdin равно None, что означает, что я не могу использовать process.stdin.write – serrapaladin