Kiedy uruchomić następujący kodPython podproces komunikować() daje Brak, gdy oczekuje się lista numer
from subprocess import call, check_output, Popen, PIPE
gr = Popen(["grep", "'^>'", myfile], stdout=PIPE)
sd = Popen(["sed", "s/.*len=//"], stdin=gr.stdout)
gr.stdout.close()
out = sd.communicate()[0]
print out
Gdzie myfile wygląda następująco:
>name len=345
sometexthere
>name2 len=4523
someothertexthere
...
...
uzyskać
None
Gdy oczekiwane wyjście jest listą liczb:
345
4523
...
...
odpowiednie polecenie uruchomić w terminalu jest
grep "^>" myfile | sed "s/.*len=//" > outfile
Dotychczas próbowałem zabawy z ucieczki i powołując się na różne sposoby, takie jak ucieczka ukośniki w SED lub dodanie dodatkowych cudzysłowów dla grep, ale możliwości kombinatoryczne są duże.
Rozważałem też tylko czytanie w pliku i pisanie odpowiedników grep i sed w Pythonie, ale plik jest bardzo duży (zawsze mogłem czytać wiersz po linii), zawsze będzie działał w systemach UNIX i ja nadal jestem ciekawy, gdzie popełniłem błędy.
Czyżby
sd.communicate()[0]
zwraca jakiś obiekt (zamiast listy liczb całkowitych), dla których żaden nie jest typ?
wiem, że mogę chwycić wyjście z check_output w prostych przypadkach:
sam = check_output(["samn", "stats", myfile])
ale nie wiem jak zrobić to praca z bardziej skomplikowanych sytuacjach były rzeczy jest coraz rurami.
Jakie są produktywne podejścia do uzyskania oczekiwanych wyników z podprocesu?
nie stosować 'check_output()' tutaj: może zawiesić 'proces grep' podaniu 'sed' umiera przedwcześnie (do GC zamyka rurę gr.stdout'' w rodzic). Aby uniknąć wywołania '.close()', zacznij od tyłu - zobacz [Jak korzystać z podprocesu.Popen do łączenia wielu procesów przez potoki?] (Http://stackoverflow.com/a/9164238/4279) – jfs
@JF Sebastian, właśnie go usunąłem, ponieważ nie ma potrzeby wywoływania podprocesu w ogóle, także co to jest 'gc'? –
Tak, tutaj nie ma potrzeby podprocesu. gc to zbieranie śmieci. – jfs