Jak przekierować wywołanie podprocesu do pliku tekstowego?

subprocess.call(["/home/myuser/run.sh", "/tmp/ad_xml",  "/tmp/video_xml"])

W tej chwili mam skrypt, który prowadzę. Kiedy go uruchamiam i uderza w tę linię, zaczyna drukować rzeczy, ponieważ run.sh ma odciski palców.

Jak mogę to również przesłać do pliku tekstowego? (A także wydrukować, jeśli to możliwe)

Author: martineau, 2011-02-01

2 answers

Jeśli chcesz zapisać wyjście do pliku, możesz użyć stdout -argumentu subprocess.call.

It takes None, subprocess.PIPE, obiekt pliku lub deskryptor pliku. Pierwszy jest domyślny, stdout jest dziedziczony od rodzica (twojego skryptu). Drugi pozwala na przesyłanie z jednego polecenia / procesu do drugiego. Trzeci i czwarty są tym, co chcesz, aby wynik został zapisany do pliku.

Musisz otworzyć plik z czymś takim jak open i przekazać obiekt lub deskryptor pliku liczba całkowita do call:

f = open("blah.txt", "w")
subprocess.call(["/home/myuser/run.sh", "/tmp/ad_xml",  "/tmp/video_xml"], stdout=f)

Zgaduję, że każdy poprawny obiekt podobny do pliku będzie działał, jak gniazdo (gasp:)), ale nigdy nie próbowałem.

Ponieważ marcog wspomina w komentarzach, że możesz również przekierować stderr, Możesz przekierować go do tej samej lokalizacji, co stdout za pomocą stderr=subprocess.STDOUT. Każda z wyżej wymienionych wartości działa również, można przekierować do różnych miejsc.

 106
Author: Skurmedel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:30

Opcje dla popen mogą być użyte w call

args, 
bufsize=0, 
executable=None, 
stdin=None, 
stdout=None, 
stderr=None, 
preexec_fn=None, 
close_fds=False, 
shell=False, 
cwd=None, 
env=None, 
universal_newlines=False, 
startupinfo=None, 
creationflags=0
Więc...
subprocess.call(["/home/myuser/run.sh", "/tmp/ad_xml",  "/tmp/video_xml"], stdout=myoutput)

Wtedy możesz zrobić co chcesz z myoutput (który musiałby być plikiem btw).

Możesz również zrobić coś bliżej wyjścia rurociągowego, takiego jak to.

dmesg | grep hda

Byłoby:

p1 = Popen(["dmesg"], stdout=PIPE)
p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE)
output = p2.communicate()[0]

Jest mnóstwo uroczych, przydatnych informacji na stronie podręcznika Pythona.

 16
Author: ocodo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-31 22:01:45