Заставить snakemake запускать python2 в правиле без --use-conda

Проблема:

Изнутри snakemake (python3) я запускаю некоторое программное обеспечение, написанное на python2. Snakemake запускает программное обеспечение с использованием python3, игнорируя shebang в файле, вызывающем python2. Это чужое программное обеспечение, поэтому я не хочу переписывать все, чтобы оно работало на python3.

Вопрос:

Как заставить snakemake запускать версию python в shebang внешнего скрипта, а не версию python в текущем env?

Предостережения:

Я знаю, что snakemake позволяет пользователю форсировать определенную среду с помощью --use-conda и вызывать среду python2. Однако я не хочу этого делать, так как полученный сценарий будет менее переносимым.

Что я пробовал:

Я пробовал добавлять внешние скрипты python с помощью #!/usr/bin/env python2 или #!/usr/bin/python2, и каждый раз скрипты терпели неудачу, потому что Snakemake запускал их с python3 вместо python2. Другие программы с любым из этих шебанг запускаются в python2, когда я вызываю скрипт из оболочки вне snakemake.

Пример:

Это змеиный файл:

#snakefile
rule all:
    input:
        my_output.txt
rule foo:
    output:
        txt = my_output.txt
    shell:
        """
        external_program.py > {output.txt}
        """

Это external_program.py:

#!/usr/bin/env python2

print "this will work in python2, but not python3"

person conchoecia    schedule 24.05.2020    source источник


Ответы (1)


Я действительно думаю, что вы должны решить эту проблему, используя среды conda. Я думаю, что ваш нынешний подход «менее переносимый». Поэтому я решил дать два ответа на этот вопрос: один с conda и один без него. В надежде, что я смогу убедить вас использовать подход conda :).

без конды

Если на вашем компьютере установлен python 2, вы, вероятно, можете вызвать его с помощью python2 или /usr/bin/python2

rule foo:
    output:
        txt = my_output.txt
    shell:
        """
        python2 external_program.py > {output.txt}
        """

с кондой

Чтобы решить эту проблему с помощью conda, нам потребуется создать файл environment.yaml:

dependencies:
  - python=2.7

и теперь мы должны обращаться к этой среде так:

rule foo:
    output:
        txt = my_output.txt
    conda: "environment.yaml"
    shell:
        """
        python2 external_program.py > {output.txt}
        """

и используйте флаг --use-conda со snakemake.

person Maarten-vd-Sande    schedule 25.05.2020