python - 在 python 代码中运行 bash for 循环时出错
问题描述
我想使用以下命令for
在我的 python 代码中运行 bash 循环,但它不起作用 ant 给出了错误:
os.system("for f in *.sam ; do samtools flagstat $f > ${f/.sam/.stat};done ")
错误是
文件 "", 第 1 行 os.system("for f in *.sam ; do samtools flagstat $f > ${f/.sam/.stat};done ") ^
如何for
在 python 代码中使用 bash 循环?
解决方案
您正在尝试在代码中使用 Bash 功能 ( ${variable/pattern/substitution}
) 。sh
您可以使用subprocess.run
withexecutable='/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
退出代码,并且您想知道它是否失败。
一般来说,您应该在 a 中运行尽可能少的代码,subprocess
因为它基本上发生在您的控制之外。你自己用 Python 编写的部分(或者更好的是import
来自维护良好的库)可以由你的 Python 代码正确管理,而与外部进程的通信必然受到限制。
也许另请参阅从 Python 运行 Bash 命令,了解为什么要避免os.system
以及 sh 和 bash 的确切含义check=True
以及区别。子进程中 'shell=True' 的实际含义解释了为什么要尽可能避免调用 shell。
为了完整起见,这里是一个语法正确、sh
兼容的for
循环:
for f in *.sam; do
samtools flagstat "$f" >"${f%.sam}.stat"
done
注意引号。
(如果你绝对想要一个单行,你可以用done
分号替换之前的换行符。)
推荐阅读
- javascript - 是否可以在 html 文件中动态加载来自 js 文件的图像?
- prolog - labeling/2 如何从域的中点生成解决方案?
- c# - ASP.NET Web api 上的文件上传端点损坏文件
- php - 发布方法在不同的服务器中无法正常工作
- javascript - 为什么我无法访问使用 Node.js/Express-TypeScript 的 SSL 证书?
- php - laravel 5.2 图像无法加载
- aws-lambda - 如何存储来自 Amazon Lex 的用户输入(话语)?
- html - 由于图像,Chrome中的Angular Firebase滚动问题
- python - 音频识别:将音频示例的大小调整为相同的长度
- wpf - 使用 IsEnabled="False" 的 WPF 禁用按钮在代码中不起作用