2016-07-29 5 views
1

Я столкнулся с проблемой, пытаясь присоединиться к некоторому коду из разных источников в 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 вызвать подпроцесс?

Любая помощь будет оценена!

ответ

0
repeats = self.__extractRepeats(repeatClass) 
for r in repeats: #Extracting maximum repeat 
    repeatStats = r.split() 
    idx = map(int,repeatStats[2][1:-1].split(','))[0] 

Если предположить, что repeatStats [2] xersiox, 10

Тогда repeatStats [2] [1: -1] становится ersiox, 1

Тогда repeatStats [2] [1: -1 ] .split (' ') приводит список [' ersio', '1']

Как у вас проходит весь список в целом заявление

idx = map(int,repeatStats[2][1:-1].split(','))[0] 
# it looks like this idx = map(int, ['ersio', '1'])[0] 
# it picks the first item from the list, which is 'ersio', which does not have any numerical in that. 

Вместо пожалуйста, попробуйте ниже:

idx = map(int,repeatStats[2][1:-1].split(',')[1])[0] 
# or provide an index of the item in the list, which has a number in it. 
+0

Если подпроцесс работает правильно, repeatStats [2] представляет собой список (численных) индексов, в скобках. – serrapaladin

+0

Можете ли вы попробовать удалить stdin = subprocess.PIPE? –

+0

Это не удается, потому что тогда process.stdin равно None, что означает, что я не могу использовать process.stdin.write – serrapaladin

Смежные вопросы