gpt4 book ai didi

从 Matlab 调用的 Python 子进程失败

转载 作者:太空宇宙 更新时间:2023-11-03 17:10:37 25 4
gpt4 key购买 nike

我在尝试在 Matlab 中加入来自不同来源的一些代码时遇到了一个问题,我真的不知道如何处理它。本质上,我有一些用于从命令行调用的压缩算法的 Python 代码,它本身使用子进程来运行编译为二进制的 C++ 代码并与之通信。

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 调用子进程?

如有任何帮助,我们将不胜感激!

最佳答案

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.

关于从 Matlab 调用的 Python 子进程失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38665247/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com