通过conda安装的Perl,使用snakemake shell出现错误:无法打开perl脚本..没有这个文件或目录

5

我目前正在编写一个 Snakemake 管道,我希望能够包含一个 Perl 脚本。 这个脚本不是我编写的,而是来自github页面。我以前从未使用过 Perl。

我通过 conda 安装了 Perl(5.32.1)。我已经安装了 Miniconda 并在我的大学 Unix 服务器上工作。

我的 perl 脚本规则代码如下:

rule r1_filter5end:
input:
    config["arima_mapping"] + "unprocessed_bam/{sample}_R1.sam"
output:
    config["arima_mapping"] + "filtered_bam/{sample}_R1.bam"
params:
conda:
    "../envs/arima_mapping.yaml"
log:
    config["logs"] + "arima_mapping/r1_filter5end/{sample}_R1.log"
threads:
    12
shell:
    "samtools view --threads {threads} -h {input} -b | perl ../scripts/filter_five_end.pl | samtools -b -o {output} 2> log"

当我运行它时,出现以下错误:

无法打开perl脚本 "../scripts/filter_five_end.pl": 没有找到该文件 或目录

从我的研究中了解到,Perl脚本的第一行设置了Perl可执行文件的路径。我下载的脚本具有以下路径:
#!/usr/bin/perl

由于我使用通过conda安装的Perl,因此这可能是错误的。所以我将路径设置为:

#!/home/mi/my_user/miniconda3/bin/perl

然而,尽管我调用了该方法,它仍然无法正常工作。

perl ../scripts/filter_five_end.pl

或者

../scripts/filter_five_end.pl

也许无法通过snakemake运行perl脚本? 有没有遇到过类似的情况?^^

3
问题不在于 shebang(井号加叹号的开头行)。shebang 中的解释器路径并不重要,因为你直接使用 perl ../path 调用它。执行此命令的 shell 会解析到 perl 程序的路径(很可能是 conda 的路径),然后运行脚本,只从脚本内部的 shebang 获取标志(如 -T-w)。错误信息表示找不到实际的脚本文件。我怀疑当你运行该 shell 命令时,所在目录不正确。尝试使用完全限定路径。 - simbabque
1
天啊,为什么总是犯这种显而易见的错误。我忘记了snakemake总是从Snakemake文件中查找文件,而不是规则所保存的目录。我的天啊,整整一天啊。但无论如何,非常感谢你! :) - snakelake
我认为这意味着我们应该关闭这个问题,是吗? - TLP
1
这些事情发生在我们所有人身上。 :) - simbabque
2个回答

4
问题并不在于shebang。shebang中的解释器路径并不重要,因为您直接使用perl ../path进行调用。执行此命令的shell将解析到perl程序的路径(很可能是conda),然后运行脚本,只从脚本内部的shebang获取标志(如-T-w)。
错误消息意味着它无法找到实际的脚本文件。我怀疑当您运行该shell命令时,它位于错误的目录中。尝试完全限定的路径。
正如 OP在他们的评论中所述

我忘记了snakemake总是从Snakemake文件而不是规则所保存的目录中查找文件。


2

虽然不是完全的答案,但也许有关:

我忘记了snakemake总是从Snakemake文件而不是规则保存的目录中查找文件。

我认为这不完全正确。参考点是由-d / --directory设置的目录,默认情况下是您执行snakemake的位置:

--directory DIR, -d DIR
    Specify working directory (relative paths in the snakefile will use this as their origin). (default: None)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接