Podstawianie procesów w stylu Basha Popenem Pythona

W Bash możesz łatwo przekierować dane wyjściowe procesu do tymczasowego deskryptora pliku i to wszystko jest automatycznie obsługiwane przez bash w ten sposób:

$ mydaemon --config-file <(echo "autostart: True \n daemonize: True")

lub tak:

$ wc -l <(ls)
15 /dev/fd/63

zobacz, jak to nie jest standardowe przekierowanie:

$ vim <(echo "Hello World") 
vim opens a text file containing "Hello world"
$ echo  "Hello World" | vim
Vim: Warning: Input is not from a terminal

W drugim przykładzie widać, jak bash automatycznie tworzy deskryptor pliku i pozwala przekazać dane wyjściowe programu do innego programu.

Teraz na moje pytanie: jak mogę zrobić to samo z Pythonem, używając Popena w module podprocesu?

Używam normalnego pliku kmers i po prostu go czytam, ale mój program generuje teraz określoną listę kmersów w czasie wykonywania na podstawie parametrów użytkownika. Chciałbym uniknąć ręcznego pisania do pliku tymczasowego, ponieważ zajmowanie się uprawnieniami do plików może powodować problemy dla moich prymitywnych użytkowników.

Oto mój kod do uruchomienia mojego programu i przechwycenia stdout z rzeczywistym plikiem „kmer_file”

input_file = Popen(["pram_axdnull", str(kmer), input_file, kmer_file], stdout=PIPE)

Stworzyłem funkcję o nazwie generate_kmers, która zwraca łańcuch, który można łatwo zapisać w pliku (zawiera znaki nowej linii) lub StringIO. Mam także skrypt Pythona, który działa samodzielnie

Więc teraz chcę przekazać go jako mój trzeci parametr:

To nie działa:

kmer_file = stringIO(generate_kmers(3))
input_file = Popen(["pram_axdnull", str(kmer), input_file, kmer_file], stdout=PIPE)

Nie robi to również:

kmer_file = Popen(["generate_kmers", str(kmer)], stdout=PIPE)
input_file = Popen(["pram_axdnull", str(kmer), input_file, kmer_file.stdout], stdout=PIPE)

Nie mam pomysłów.

Czy ktoś zna dobry sposób na rozwiązanie tego problemu? Myślałem o użyciu opcji shell = True i używaniu rzeczywistego bashizmu <(), ale tego nie zrozumiałem.

Dziękuję Ci!

questionAnswers(2)

yourAnswerToTheQuestion