【发布时间】:2014-04-08 02:51:08
【问题描述】:
我需要从 python 脚本调用 bash 并将结果存储在变量中(输出为一个数字)。
我需要
output = subprocess.call('command', shell=True)
用 command 替换为我的 bash 单行代码的输出,如下所示:
cat file.sam | grep -v "@" | grep "gi|519666810|ref|NM_001278619.1|" | perl -lane '$l = 0; $F[5] =~ s/(\d+)[MX=DN]/$l+=$1/eg; print $l' | awk '{ sum+=$1} END {print sum}'
我知道简单的命令可以正常工作:
output = subprocess.check_output("echo 122;", shell=True)
我的问题是,我需要 bash 单行而不是 122。如果我不需要重新格式化它并且可以按原样使用它,那将是完美的。
这是我的尝试:
output = subprocess.check_output("cat file.sam | grep -v "@" | grep "gi|519666810|ref|NM_001278619.1|" | perl -lane '$l = 0; $F[5] =~ s/(\d+)[MX=DN]/$l+=$1/eg; print $l' | awk '{ sum+=$1} END {print sum}'
", shell=True)
File "script.py", line 9
output = subprocess.check_output("cat file.sam | grep -v "@" | grep "gi|519666810|ref|NM_001278619.1|" | perl -lane '$l = 0; $F[5] =~ s/(\d+)[MX=DN]/$l+=$1/eg; print $l' | awk '{ sum+=$1} END {print sum}'
^
SyntaxError: invalid syntax
尝试二:
output = subprocess.check_output("cat file.sam | grep -v \"@\" | grep \"gi|519666810|ref|NM_001278619.1|\" | perl -lane '$l = 0; $F[5] =~ s/(\d+)[MX=DN]/$l+=$1/eg; print $l' | awk '{ sum+=$1} END {print sum}'
", shell=True)
File "script.py", line 9
output = subprocess.check_output("cat file.sam | grep -v \"@\" | grep \"gi|519666810|ref|NM_001278619.1|\" | perl -lane '$l = 0; $F[5] =~ s/(\d+)[MX=DN]/$l+=$1/eg; print $l' | awk '{ sum+=$1} END {print sum}'
^
SyntaxError: EOL while scanning string literal
【问题讨论】:
-
我不明白你的问题是什么。它适用于
echo 122吗?当你用你的实际命令替换它时会发生什么? -
您需要将 bash 命令管道分解为子进程的各个命令,然后使用子进程创建管道。但说真的,为什么不在 python 中这样做而不是搞乱 bash?
-
@Blorgbeard 我编辑了我的问题以使其更清楚,谢谢
-
您在最后一次尝试中错过了结束
")。