Подпроцесс Python() чтение файла в bash

#python #python-3.x #shell #subprocess

Вопрос:

У меня есть команда оболочки для файла, как указано ниже:

 filename="/4_illumina/gt_seq/gt_seq_proccessor/200804_MN01111_0025_A000H35TCJ/fastq_files/raw_data/200804_MN01111_0025_A000H35TCJ.demultiplex.log"  assembled_reads=$(cat $filename | grep -i " Assembled reads ...................:" | grep -v "Assembled reads file...............:")  

Теперь я пытаюсь запустить это в среде python, используя подпроцесс как:

 task = subprocess.Popen("cat $filename | grep -i " Assembled reads ...................:" | grep -v "Assembled reads file...............:"", shell=True, stdout=subprocess.PIPE) p_stdout = task.stdout.read() print (p_stdout)  

Это не работает, потому что я не могу проанализировать переменную имени файла из python в оболочку, и, вероятно, в том, как я написал команду grep, есть синтаксическая ошибка.

Есть какие-нибудь предложения ?

Комментарии:

1. Кавычки не сбалансированы.

2. Спасибо, просто отредактировал их

3. Попробовал в начале вашей первой строки Python task = subprocess.Popen(f"cat ${filename} | … (затем остальная часть этой строки), где вы тоже используете это назначение имени файла, которое вы опубликовали выше в Python? Есть ли шанс, что вы сможете использовать IPython или Jupyter на своей машине? В этих случаях вы можете использовать более простые варианты смешивания в bash с Python.

4. Кавычки все еще несбалансированы. Вы должны убежать от внутреннего " s с помощью a "" .

5. Это работает task = subprocess.Popen(f"cat {filename}", shell=True,stdout=subprocess.PIPE)

Ответ №1:

Этот код, похоже, решает вашу проблему без каких-либо внешних инструментов.

 filename="/4_illumina/gt_seq/gt_seq_proccessor/200804_MN01111_0025_A000H35TCJ/fastq_files/raw_data/200804_MN01111_0025_A000H35TCJ.demultiplex.log" for line in open(filename):  if "Assembled reads" in line and "Assembled reads file" not in line:  print(line.rstrip())  

Комментарии:

1. Спасибо, я решил пойти по питоническому пути!

Ответ №2:

Я бы подумал о том, чтобы выполнить все чтение и поиск на python и, возможно, переосмыслить то, чего вы хотите достичь, однако:

В скорлупе:

 $ export filename=/tmp/x-output.GOtV   

В Python (обратите внимание на доступ $filename и смешивание кавычек в команде, я также использую пользовательскую команду grep, чтобы немного упростить ситуацию):

 import os import subprocess tmp = subprocess.Popen(f"cat {os.environ['filename']} | grep -i 'x'", shell=True, stdout=subprocess.PIPE) data = tmp.stdout.read() print(data)  

Хотя это и работает, решение есть … не то, что я считаю чистым кодом.