Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 执行命令并将输出存储在数组变量中_Python_Perl_Popen - Fatal编程技术网

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 );