Как мне указать количество ядер ЦП, которые будут использоваться в скрипте python, запущенном через скрипт bash? - PullRequest
0 голосов
/ 30 сентября 2019

Я хочу выровнять некоторые файлы fasta с геномом, и чтобы сделать это быстро, у меня есть скрипт на python, который просматривает каталог, чтобы выбрать только определенные файлы. Я использовал подпроцесс, который включал все, что в противном случае я поместил бы в базовый скрипт bash, если бы я не запускал его в цикле. Проблема в том, что я хочу запустить его параллельно, однако использование $ NSLOTS внутри подпроцесса не работает.

Мой скрипт bash выглядит так:

#!/bin/bash --login
#$ -cwd
#$ -pe smp.pe 8 #specifies to use 8 cores

module load apps/binapps/anaconda3/2019.03  #Python 3.7.3
module load apps/bioinf
module load apps/star/2.5.3a/gcc-4.8.5

python STAR_aligner.py

Мой скрипт на Python такой:

import subprocess
import os

directory = '/mnt/fls01-home01/mfbx3sgh/scratch/Trimming'
genome_idx = '/mnt/fls01-home01/mfbx3sgh/scratch/Genome_Index'
genome_dir = '/mnt/fls01-home01/mfbx3sgh/scratch/Genome/'

file_list = os.listdir(directory)

for read_1 in file_list:

    if 'paired' in read_1:

        if '_1_' in read_1:

            read_2 = read_1.replace('_1_', '_2_')

            subprocess.run(['STAR', '--runThreadN', '$NSLOTS', '--genomeDir', genome_idx, '--readFilesIn', read_1,
                            read_2, '--readFilesCommand', 'gunzip', '-c', '--outFileNamePrefix', genome_dir])

Как вы видите, я указываю использовать 8 ядер в скрипте bash, а затем в бите подпроцесса я вызываю $ NSLOTS, который, когда он не находится внутри скрипта python, работает с указанными ядрами.

Я получаю ошибку

EXITING: fatal input ERROR: runThreadN must be >0, user-defined runThreadN=0

Sep 30 11:52:24 ...... FATAL ERROR, exiting

1 Ответ

0 голосов
/ 30 сентября 2019

Сценарий Python, похоже, вообще не добавляет никакого значения, вы должны просто написать все это как Bash-скрипт.

#!/bin/bash
root="/mnt/fls01-home01/mfbx3sgh/scratch"
for read_1 in "$root/Trimming/"*; do
    case $read_1 in
     *paired*_1_*|*_1_*paired*)
        STAR --runThreadN "$NSLOTS" --genomeDir "$root/Genome_Index/" \
          --readFilesIn "$read_1" "${read_1//_1_/_2_}" \
          --readFilesCommand gunzip -c --outFileNamePrefix "$root/Genome/" ;;
    esac
done

Если ваш вопрос заключается в том, как правильно использовать $NSLOTS изPython, это будет

os.environ['NSLOTS']

(строка '$NSLOTS' - это просто статическая строка $, N, S и т. Д.)

...