#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)
Хотя это и работает, решение есть … не то, что я считаю чистым кодом.