Код на Python в скрипт на Bash

Рейтинг: 0Ответов: 3Опубликовано: 16.05.2023

У меня есть скрипт на баше:

#!/bin/bash

# Переменная BAM_FILE будет содержать список всех bam-файлов в текущей директории
BAM_FILE=$(ls *.bam)

for FILE in ${BAM_FILE}; do

    # Имя файла без расширения
    NAME=$(basename ${FILE} .bam)

    # Получаем fastq 1 и 2
    samtools fastq -1 ${NAME}_R1.fastq -2 ${NAME}_R2.fastq ${NAME}_hlareg.bam

Далее часть кода выполняется на Python. Как мне интегрировать его в скрипт? Я делаю вот так, но output-файлы на создаются:

python -c '
import sys

def sync_fastq_files():
    file1 = "${NAME}_R1.fastq"
    file2 = "${NAME}_R2.fastq"
    output_file1 = "${NAME}_R1_sync.fastq"
    output_file2 = "${NAME}_R2_sync.fastq"

    with open(file1, "r") as f1, open(file2, "r") as f2, \
          open(output_file1, "w") as out1, open(output_file2, "w") as out2:
        while True: 
    ...... 
'

Отдельно код на питоне работает, когда вместо file1, file2, output_file1, output_file2 прописать название самих файлов (например, тестовых двух файлов), но мне нужно, чтобы код работал для всех файлов в директории, содержащих ${NAME} в названии.

Ответы

▲ 1

Не проверял, но думаю так:

python -c '
import os, sys

def sync_fastq_files():
    name = os.environ["NAME"]
    file1 = f"{name}_R1.fastq"
    file2 = f"{name}_R2.fastq"
    output_file1 = f"{name}_R1_sync.fastq"
    output_file2 = f"{name}_R2_sync.fastq"

    with open(file1, "r") as f1, open(file2, "r") as f2, \
          open(output_file1, "w") as out1, open(output_file2, "w") as out2:
        while True: 
    ...... 
'
▲ 1

Вы используете одинарные кавычки '...' для вставки кода на Python поэтому ваши переменные из bash'а не работают. Используйте двойные "..." а внутри одинарные или используйте heredoc конструкцию:

python -c << EOF
...
EOF
▲ 1

можно сразу запустить в Bash код командой
python main.py

А можно
python -c "print('hello world')"