Powiedzmy miałem następujące polecenie działa z powłokiJak dołączyć do stdout dwóch podprocesów i rurę do standardowego wejścia nowych podproces w Pythonie
{
samtools view -HS header.sam; # command1
samtools view input.bam 1:1-50000000; # command2
} | samtools view -bS - > output.bam # command3
Dla tych z Was, którzy nie są zaznajomieni z widokiem samtools (Ponieważ jest to stackoverflow). W istocie chodzi o stworzenie nowego pliku bam, który ma nowy nagłówek. Pliki bam są zwykle dużymi skompresowanymi plikami, więc nawet przechodzenie przez ten plik w niektórych przypadkach może być czasochłonne. Jednym z alternatywnych podejść byłoby poddanie komendy2, a następnie użycie repozytorium samtools do przełączenia nagłówka. To przechodzi przez duży plik dwa razy. Powyższe polecenie przechodzi przez bam jednorazowo, co jest dobre dla większych plików bam (stają się większe niż 20 GB, nawet gdy są skompresowane - WGS).
Moje pytanie brzmi: jak zaimplementować polecenia tego typu w pythonie za pomocą podprocesu.
mam następujące:
fh_bam = open('output.bam', 'w')
params_0 = [ "samtools", "view", "-HS", "header.sam" ]
params_1 = [ "samtools", "view", "input.bam", "1:1-50000000"]
params_2 = [ "samtools", "view", "-bS", "-" ]
sub_0 = subprocess.Popen(params_0, stderr=subprocess.PIPE, stdout=subprocess.PIPE)
sub_1 = subprocess.Popen(params_1, stderr=subprocess.PIPE, stdout=subprocess.PIPE)
### SOMEHOW APPEND sub_1.stdout to sub_0.stdout
sub_2 = subprocess.Popen(params_2, stdin=appended.stdout, stdout=fh_bam)
Każda pomoc jest mile widziana. Dzięki.
co to jest 'fh_bam'? Dlaczego po prostu nie uzyskasz danych wyjściowych z obu i użyjesz go w poleceniu do ostatniego procesu? –
Obsługa plików wyjściowego bam. Cóż, pierwsze dwie komendy zasadniczo czytają część pliku i umieszczają ją na standardowe wyjście. Zatem "pobieranie danych wyjściowych" jest już dostępne w plikach. Jedyna różnica polega na tym, że drugie polecenie faktycznie chwyta część pliku. I ten konkretny plik jest skompresowany, więc dołączanie plików nie jest tak proste. –
Czy chcesz uzyskać wyjście z drugiego połączenia lub obu? –