在python cod中运行bash for循环时出错

2024-05-13 05:29:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我想使用以下命令在python代码中运行bashfor循环,但它不起作用,ant给出了错误:

os.system("for f in *.sam ; do samtools flagstat $f > ${f/.sam/.stat};done ")

错误是

File "", line 1 os.system("for f in *.sam ; do samtools flagstat $f > ${f/.sam/.stat};done ") ^

如何在python代码中使用bashfor循环?你知道吗


Tags: 代码in命令forossam错误system
1条回答
网友
1楼 · 发布于 2024-05-13 05:29:54

您正试图在sh代码中使用Bash特性(${variable/pattern/substitution})。可以将subprocess.runexecutable='/bin/bash'一起使用,但实际上没有理由在shell中运行循环。你知道吗

import glob
import subprocess

for file in glob.glob('*.sam'):
    with open(file.replace('.sam', '.stat'), 'w') as output:
        subprocess.run(['samtools', 'flagstat', file],
            stdout=output, check=True)

check=True假设samtools返回一个有用的退出代码,并且您想知道它是否失败。你知道吗

一般来说,您应该在subprocess中运行尽可能少的代码,因为它基本上是在您的控制之外发生的。您自己用Python编写的部分(或者更好地说是来自维护良好的库的import)可以由Python代码正确管理,而与外部进程的通信必然受到限制和约束。你知道吗

关于为什么要避免os.system以及check=TrueDifference between sh and bash的确切含义,也可以参见Running Bash commands from PythonActual meaning of 'shell=True' in subprocess解释了如果可以避免调用shell的原因。你知道吗

为了完整性起见,这里有一个语法正确的、兼容shfor循环:

for f in *.sam; do
    samtools flagstat "$f" >"${f%.sam}.stat"
done

注意quotes.

(如果绝对需要一行,可以用分号替换done之前的换行符。)

相关问题 更多 >