当我在snakemake(使用python代码)中使用run指令时,它不会产生任何类型的错误消息来进行故障排除。这是期望的行为吗?我错过了什么吗?
这是一个使用 Snakemake 7.8.3 和 python 3.9.13 的最小示例。我使用 shell 指令中的选项调用 Snakemake,-p该选项输出传递给 shell 的确切代码(但我猜对 run 指令没有做任何事情)。
蛇文件:
def useless_function():
return[thisVariableAlsoDoesntExist]
rule all:
input: "final.txt"
rule test:
output: "final.txt"
run:
print(thisVariableDoesNotExist)
useless_function()
Run Code Online (Sandbox Code Playgroud)
标准输出:
Building DAG of jobs...
Using shell: /usr/bin/bash
Provided cores: 1 (use --cores to define parallelism)
Rules claiming more threads will be scaled down.
Job stats:
job count min threads max threads
----- ------- ------------- -------------
all 1 1 1
test 1 1 1
total 2 1 1 …Run Code Online (Sandbox Code Playgroud) 我\xc2\xb4m 目前正在编写一个snakemake 管道,我想为其包含一个perl 脚本。\n该脚本不是我编写的,而是来自github页面。我以前从未使用过 Perl。
\n我通过 conda 安装了 perl (5.32.1)。我已经安装了 miniconda 并正在我的大学 unix 服务器上工作。
\n我的 Perl 脚本规则的代码如下所示:
\nrule r1_filter5end:\ninput:\n config["arima_mapping"] + "unprocessed_bam/{sample}_R1.sam"\noutput:\n config["arima_mapping"] + "filtered_bam/{sample}_R1.bam"\nparams:\nconda:\n "../envs/arima_mapping.yaml"\nlog:\n config["logs"] + "arima_mapping/r1_filter5end/{sample}_R1.log"\nthreads:\n 12\nshell:\n "samtools view --threads {threads} -h {input} -b | perl ../scripts/filter_five_end.pl | samtools -b -o {output} 2> log"\nRun Code Online (Sandbox Code Playgroud)\n当我运行此命令时,我收到以下错误:
\n\n\n无法打开 Perl 脚本“../scripts/filter_ Five_end.pl”:找不到这样的文件\或目录
\n
根据我在研究过程中了解到的情况,perl 脚本的 1. 行设置了我的 perl 可执行文件的路径。我下载的脚本的路径如下:
\n#!/usr/bin/perl\nRun Code Online (Sandbox Code Playgroud)\n由于我使用通过 conda 安装的 perl,这可能是错误的。所以我将路径设置为:
\n#!/home/mi/my_user/miniconda3/bin/perl\nRun Code Online (Sandbox Code Playgroud)\n然而,无论我是否打电话,这仍然不起作用
\n …我有 3 条规则,它们的名字有点长。使用时ruleorder,该行超出了我想要的 80 个字符限制。是否可以将其分解ruleorder为多行,使得行为与我将其全部写在一行中完全相同?
例子:
ruleorder: long_rule_1 > long_rule_2 > long_rule_3
Run Code Online (Sandbox Code Playgroud)
我想将其重新格式化为这样的内容:
ruleorder: (
long_rule_1
> long_rule_2
> long_rule_3
)
Run Code Online (Sandbox Code Playgroud) 我正在为snakemake工作流程编写Snakefile。作为工作流程的一部分,我需要检查数据库中的一组记录是否已更改,以及是否已重新下载它们。
我的想法是编写一条规则来检查数据库时间戳并将其写入输出文件。并将时间戳文件用作我的下载规则的输入。问题是一旦写入了时间戳文件,该时间戳规则将永远不会再次运行,因此该时间戳将永远不会更新。
有没有办法使该规则每次运行。(我知道我可以从shell强制使用它,但是我想在Snakefile中指定它)或者,有没有更好的方法来处理这个问题?
以下snakemake脚本:
rule all:
input:
'test.done'
rule pipe:
output:
'test.done'
shell:
"""
seq 1 10000 | head > test.done
"""
Run Code Online (Sandbox Code Playgroud)
失败并显示以下错误:
snakemake -s test.snake
Provided cores: 1
Rules claiming more threads will be scaled down.
Job counts:
count jobs
1 all
1 pipe
2
rule pipe:
output: test.done
jobid: 1
Error in job pipe while creating output file test.done.
RuleException:
CalledProcessError in line 9 of /Users/db291g/Tritume/test.snake:
Command '
seq 1 10000 | head > test.done
' returned non-zero exit status 141. …Run Code Online (Sandbox Code Playgroud) 我benchmark在snakemake工作流程中包括了一些规则的指令,并且生成的文件具有以下标头:
s h:m:s max_rss max_vms max_uss max_pss io_in io_out mean_load
Run Code Online (Sandbox Code Playgroud)
我找到的唯一文档提到了“基准txt文件(它将在MiB中包含运行时间和内存使用情况的制表符分隔的表)”。
我可以猜测,第1列和第2列是显示执行规则所花费时间的两种不同方式(以秒为单位,并转换为小时,分钟和秒)。
io_in并io_out可能与磁盘的读取及写入活动,但在被他们测量什么单位?
还有什么?这是在某处记录的吗?
我在中找到了以下代码/snakemake/benchmark.py,这很可能是基准数据的来源:
s h:m:s max_rss max_vms max_uss max_pss io_in io_out mean_load
Run Code Online (Sandbox Code Playgroud)
因此,这似乎来自所提供的功能psutil。
我有一个工作流,首先从公共数据库下载文件,然后在后续步骤中处理这些文件以创建多个聚合数据表。
我正在没有互联网连接的机器上测试工作流程。我在另一台机器上运行了初步数据下载步骤并将它们复制到这台机器上,现在我正在尝试运行其余的工作流程。当我运行snakemake -np它时,它报告所有数据下载作业仍然需要完成,即使目标文件已经存在。我什至ancient()在后续处理规则中标记了这些文件,但这无济于事。
我怎样才能让 Snakemake 相信这些作业不需要重新运行?
我想做一个工作流,从远程服务器下载一些 FASTQ 文件的列表,检查 md5 并运行一些后处理,例如对齐。
我了解如何使用两个工作流程来实现这一点:
首先下载fastq文件列表文件,例如md5文件。
读取md5文件内容并在all规则中为所需的结果文件创建相应的目标。
我想在一个工作流程中做到这一点。下面不正确的工作流程显示了我想要实现的想法。
在all规则input:部分我不知道文件下载和解析{sample}之前的值md5
我尝试使用动态、检查点和子分支流,但未能达到预期的结果。至于dynamic我只为动态(“fastq/{sample}.fq.gz.md5”)输出实现了这个工作流程。
此外,我对不使用的解决方案感兴趣,dynamic因为它已被弃用。
rule all:
input:
"md5",
"bams/{sample}.bam",
rule download_files_list:
output: "md5"
#shell: "wget {}".format(config["url_files_list"])
run:
# For testing instead of downloading:
content = """
bfe583337fd68b3 ID_001_1.fq.gz
1636b6756daa65f ID_001_2.fq.gz
0428baf25307249 ID_002_1.fq.gz
de33d81ba5bfa62 ID_002_2.fq.gz
""".strip()
with open(output[0], mode="w") as f:
print(content, file=f)
rule fastq_md5_files:
input: "md5"
output: "fastq/{sample}.fq.gz.md5"
shell: "mkdir -p fastq && awk '{{ …Run Code Online (Sandbox Code Playgroud) 我是Snakemake的新手,我想编写一个非常简单的Snakefile,其规则将每个输入文件分别处理为一个输出文件,但是由于某种原因,我的通配符无法正确解释。
我在Ubuntu 18.04中使用输入文件“ test / test1.txt”,“ test / test2.txt”和Snakefile设置了一个最小的,可重现的示例环境。(snakemake版本5.5.4)
Snakefile:
ins = glob_wildcards("test/{f}.txt")
rule all:
input: expand("out/{f}.txt", f=ins)
rule test:
input: "test/{f}.txt"
output: "out/{f}.txt"
shell: "touch {output}"
Run Code Online (Sandbox Code Playgroud)
生成作业的DAG时,此Snakefile引发以下错误:
Missing input files for rule test:
test/['test1', 'test2'].txt
Run Code Online (Sandbox Code Playgroud)
任何想法如何解决此错误?
我想让 Snakemake 为各个规则设置绑定内存限制。根据snakemake 文档,mem_mb参数似乎可行,但该作业使用的内存比我分配的内存多。
这是一个使用几 GB 内存的简单规则。我希望规则在达到内存限制后停止,但它可以毫无问题地完成。
rule:
output:
"a"
threads: 1
resources:
mem_mb = 100
shell:
"""
python3 -c 'import numpy; x=numpy.ones(1_000_000_000)'
touch a
"""
Run Code Online (Sandbox Code Playgroud)
是否可以使此限制绑定?我想要一个可移植的解决方案,适用于 Windows 和 Linux。我在本地使用snakemake,而不是批处理调度程序或容器设置。