Python 使用os.system和snakemake.shell的区别
我对snakemake还相当陌生,所以我仍然难以将shell命令和python代码结合起来 我的解决方案是生成脚本文件,然后在此脚本中执行shell命令 在执行命令行的envokingPython 使用os.system和snakemake.shell的区别,python,snakemake,Python,Snakemake,我对snakemake还相当陌生,所以我仍然难以将shell命令和python代码结合起来 我的解决方案是生成脚本文件,然后在此脚本中执行shell命令 在执行命令行的envokingsnakemake.shell和os.system之间是否存在机械上的差异 例如: sample = ["SRR12845350"] rule prefetch: input: "results/Metadata/{sample}.json" output:
snakemake.shell
和os.system
之间是否存在机械上的差异
例如:
sample = ["SRR12845350"]
rule prefetch:
input:
"results/Metadata/{sample}.json"
output:
"results/SRA/{sample}.sra
params:
"prefetch %s -o %s"
script:
"scripts/prefetch.py"
而prefetch.py
是:
from json import load
from snakemake import shell
from os import system
json_file = snakemake.input[0]
prefetch = snakemake.params[0]
sra_file = snakemake.output[0]
json = load(open(json_file))
sra_run = json["RUN_accession"]
shell(prefetch %(sra_run, sra_file)) # option 1
system(prefetch %(sra_run, sra_file)) # option 2
shell
只是一个帮助函数,可以更轻松地从snakemake调用命令行参数。学习snakemake可能会让人不知所措,学习Python的os.system
和子流程的精细复杂性也会让人感到不必要的复杂。snakemakeshell
命令执行一些健全性检查,设置一些环境变量,例如命令可以使用的线程数和一些其他“小”内容,但只对命令调用subprocess.Popen
。这两个选项都应该有效,但由于您正在编写snakemake包装器,因此使用shell可能会稍微好一些,因为它是为snakemake设计的。一些自我宣传:我基于snakemake制作了一个管道,可以从SRA/GEO/ENA/DDBJ为您下载示例。看一看,它可能会做你想做的事情,否则可能会帮助你解决未来的问题:os.system()
通常不应该在新代码中使用,除非你完全理解它是如何工作的;使用它时很容易无意中产生安全漏洞。通常(没有任何特定于snakemake的内容),subprocess.Popen
,subprocess.run
,等等都应该使用……例如,如果运行os.system(f“prefetch results/Metadata/{sample}.json-o results/SRA/{sample}.SRA”)
,如果你的代码被传递了一个包含$(rm-rf~)
@Maarten vd Sande自广告的示例值,那你的日子会很糟糕-你的工具对于一般的生物信息学分析非常有用-我一定会看看我是否能从中获得一些关于蛇制造设置的灵感,并将此书签以备将来使用@Kasper,这取决于是否使用了shell=True
。如果它处于关闭状态(默认情况下),将不会处理命令替换,如$(…)
。