在输入指令中使用 '~' (A.K.A.tilde) 似乎不起作用?

Using '~' (A.K.A. tilde) in input directive does not seem to work?

这是我第一次尝试在输入中使用“~”。 当我将“~”转换为绝对路径时它起作用了。

证明它们是同一个文件:

(CentOS5-Compatible) [tboyarski@login2 6-bamMetrics]$ ls ~/share/references/rRNA.ensg72.hg19.interval_list
-rw-rw-r-- 1 fcchan users 24K Dec 12  2013 /home/tboyarski/share/references/rRNA.ensg72.hg19.interval_list

(CentOS5-Compatible) [tboyarski@login2 6-bamMetrics]$ ls /genesis/extscratch/clc/references/rRNA.ensg72.hg19.interval_list
-rw-rw-r-- 1 fcchan users 24K Dec 12  2013 /genesis/extscratch/clc/references/rRNA.ensg72.hg19.interval_list

(CentOS5-Compatible) [tboyarski@login2 6-bamMetrics]$ ls /home/tboyarski/share/references/rRNA.ensg72.hg19.interval_list
-rw-rw-r-- 1 fcchan users 24K Dec 12  2013 /home/tboyarski/share/references/rRNA.ensg72.hg19.interval_list

无效:

rule intervalList:
    input:
       "~/share/references/rRNA.ensg72.hg19.interval_list"

作品:

rule intervalList:
    input:
       "/home/tboyarski/share/references/rRNA.ensg72.hg19.interval_list"

我目前只尝试在输入指令中使用它。我可能会花点时间看看它是否可以用作输出指令(不是我需要的东西,只是好奇)。

想法?

编辑

@alvits 能够指出 ~ 在被评估之前被 shell 转换为 ${HOME} 。似乎在向 snakemake 提供 ~ 时,不会发生这种转换。简单的替代方法是始终使用 ${HOME},它适用于 MacOSX 和 Linux :).

我能够成功使用以下内容:

rule intervalList:
    input:
       "${HOME}/share/references/rRNA.ensg72.hg19.interval_list"

第二次编辑

用户指出我认为的解决方案实际上不是。 解决方案是在输入指令中不使用“~”或“${HOME}”。

您可以尝试将路径包装在 os.path.expanduser 中(在您的 snakefile 中 import os 之后可用):

On Unix and Windows, return the argument with an initial component of ~ or ~user replaced by that user‘s home directory.

(引自文档:https://docs.python.org/3/library/os.path.html#os.path.expanduser

我要结束这个问题。

我最终接受了@alvits 的建议。

我选择它是因为它代表波浪号,所以以非引用形式提供它是有意义的。

expanduser wrapping,虽然有可能,但对于所需的东西来说是多余的。

谢谢大家的帮助!

2017/06/09 - 编辑:不要在 Snakemake 输入中使用“~”或“${HOME}”。

看到 Johannes Köster 的评论后,我仔细检查了我所做的,但我无法重现它。

对于造成的混乱,我深表歉意。非常感谢您发现这个错误 J.K.

我不确定我之前设置了什么。我最终改变了文件的使用方式,即使使用 git,我也无法重现它。