Python 执行命令并将输出存储在数组变量中
我想执行这个字符串Python 执行命令并将输出存储在数组变量中,python,perl,popen,Python,Perl,Popen,我想执行这个字符串our\u cmd 我试过的是这个 p = Popen(our_cmd, shell=True, stdout=PIPE, stderr=PIPE) output = p.communicate()[0] split = output.strip('\n\t\r').split("\n") 我的命令正在执行,但输入不正确。我需要以Python代码的格式以数组形式输出。从您的问题中可以看出,您所需要的只是 my @output = `$our_cmd`; ## here com
our\u cmd
我试过的是这个
p = Popen(our_cmd, shell=True, stdout=PIPE, stderr=PIPE)
output = p.communicate()[0]
split = output.strip('\n\t\r').split("\n")
我的命令正在执行,但输入不正确。我需要以Python代码的格式以数组形式输出。从您的问题中可以看出,您所需要的只是
my @output = `$our_cmd`; ## here command is executing
my @split = grep(s/\s*$//g, @output); ## the format and putting in new array
@split = split("\n", @split);
我认为您在这里误解了几个perl概念。例如,您正在
split
ing一个数组-这没有多大意义,因为split
基于分隔符将字符串转换为数组
同样地grep
-这是grep
的一个不寻常的用法,因为您已经嵌入了搜索和替换模式-通常grep
用于基于布尔表达式的过滤。(我怀疑它是这样工作的,但我不能完全确定替换模式是否返回true/false,这在grep
上下文中会产生奇怪的结果)
那么,我们改为:
my @split = `$our_cmd`;
chomp @split;
这将在@output
中输入每行一个元素(包括换行符),然后删除其中的任何\t
或\r
。如果您不想要换行,正如Borodin所说-chomp@output代码>将处理该问题
如注释中所述-这可能无法准确再现strip
正在做的事情,并且strip
操作在perl中可能是不相关的
测试你的grep:
my @output = `$our_command`;
chomp @output; #removes linefeeds from each element.
for ( @output ) { s/[\t\r]//g; }; #removes linefeeds and carriage returns
这确实会在$\uu
(grep
的每一行)上执行搜索和替换,但替换表达式会返回“true/false”——这意味着您实际上会丢弃根本不包含模式的元素 您能给出一些您正在解析的输出的示例吗?@AlessandroDaRugna:Python代码中的返回代码和stderr
的内容被忽略。您的Python代码在内存中累积stderr
,然后在最后丢弃它。要从shell命令中获取标准输出行作为列表并放弃其标准输出:lines=check\u output(out\u cmd,shell=True,stderr=DEVNULL)。splitlines()
我对条带不太确定-我想它好像在删除一些字符?@Sobrique:它正在删除所有制表符、换行符,回车从字符串的开头和结尾返回。否则,split
将在末尾返回一个空字符串。Python代码仅从输出的第一行开始和最后一行结束处删除这些字符。无论如何,不应该有任何CR字符。
my @test = ( "test aaa bbb", "mooo", " aaa Moo MMOoo", "no thing in it" );
print join ("\n", grep { s/aaa//g } @test );