snakemake:使用run指令时如何实现log指令?

snakemake:使用run指令时如何实现log指令?,snakemake,Snakemake,Snakemake允许使用指定日志文件名称的log参数为每个规则创建日志。通过管道将shell输出的结果传输到此日志相对简单,但我无法找到一种方法来记录runoutput的输出(即python脚本) 一种解决方法是将python代码保存在脚本中,然后从shell中运行,但我想知道是否还有其他方法?我有一些规则同时使用log和run指令。在run指令中,我“手动”打开并写入日志文件 例如: 规则计算\u RPM: 输入: 计数\u表=源\u小\u RNA\u计数, summary\u table=

Snakemake允许使用指定日志文件名称的
log
参数为每个规则创建日志。通过管道将
shell
输出的结果传输到此日志相对简单,但我无法找到一种方法来记录
run
output的输出(即python脚本)


一种解决方法是将python代码保存在脚本中,然后从shell中运行,但我想知道是否还有其他方法?

我有一些规则同时使用
log
run
指令。在
run
指令中,我“手动”打开并写入日志文件

例如:

规则计算\u RPM:
输入:
计数\u表=源\u小\u RNA\u计数,
summary\u table=rules.gather\u read\u counts\u summaries.output.summary\u table,
tags_table=rules.associate_small_type.output.tags_table,
输出:
RPM_表=OPJ(
不可计数,
“在%s”%genome“{small\u type}\u RPM.txt”上的所有{mapped\u type}\u”,
日志:
log=OPJ(log_dir,“compute_RPM{mapped_type}”,“small_type}.log”),
基准:
OPJ(log_dir,“compute_RPM_{mapped_type}”,“small_type}\u benchmark.txt”),
运行:
打开(log.log,“w”)作为日志文件:
logfile.write(f“从{input.counts\u table}读取列计数\n”)
计数\u数据=pd.read\u表格(
input.counts_表,
索引_col=“基因”)
logfile.write(f“从{input.summary_table}\n中读取非结构映射程序的数量”)
norm=pd.read\U表格(input.summary\U表格,索引\U col=0)。loc[“非结构性”]
logfile.write(str(norm))
logfile.write(“每百万个非结构映射器的计算计数\n”)
RPM=1000000*计数\u数据/标准
在csv(output.RPM\u table,sep=“\t”)中添加\u tags\u列(RPM,input.tags\u table,“small\u type”)。)
对于写入stdout的第三方代码,可能
重定向\u stdout
上下文管理器会有所帮助(在中找到,记录在 )

测试snakefile,
Test\u run\u log.snakefile

从contextlib导入重定向\u stdout
规则所有:
输入:
“test_run_log.txt”
规则测试运行日志:
输出:
“test_run_log.txt”
日志:
“测试运行日志。日志”
运行:
打开(日志[0],“w”)作为日志文件:
使用重定向\u标准输出(日志文件):
打印(f“将结果写入{output[0]}”)
打开(输出[0],“w”)作为输出文件:
out\u file.write(“结果\n”)
运行它:

$ snakemake -s test_run_log.snakefile
结果:

$ cat test_run_log.log 
Writing result to test_run_log.txt
$ cat test_run_log.txt 
result

我的解决办法如下。这对于正常日志和带有回溯的日志异常都很有用。然后,可以将记录器设置包装到函数中,使其更有条理。但它并不很漂亮。如果snakemake能自己做会更好

导入日志
#一些东西
规则日志记录\u测试:
输入:“input.json”
output:'output.json'
日志:“规则\u日志/logging\u测试.log”
运行:
logger=logging.getLogger('logging\u test')
fh=logging.FileHandler(str(log))
fh.setLevel(logging.INFO)
格式化程序=日志记录。格式化程序('%(asctime)s-%(levelname)s-%(message)s')
fh.设置格式化程序(格式化程序)
logger.addHandler(fh)
尝试:
logger.info('启动操作!')
#做点什么
将open(str(输出),“w”)作为f:
f、 写('success!')
logger.info('end!')
例外情况除外,如e:
记录器错误(e,exc_info=True)

在野外发现的,但看起来确实很难看。@JeeYem:谢谢你的快速回复和链接!现在看来,最好的方法是登录shell(使用python脚本)。谢谢!这是一个有趣的方法,现在我决定只在shell中运行脚本并保存日志(因为它看起来更容易阅读),但我可以看到在脚本不可能/不需要的情况下,您的解决方案如何更好。