Co robię w linii poleceń:
cat file1 file2 file3 > myfile
Co chcę zrobić z Pythonem:
import subprocess, shlex
my_cmd = 'cat file1 file2 file3 > myfile'
args = shlex.split(my_cmd)
subprocess.call(args) # spits the output in the window i call my python program
python
subprocess
catatemypythoncode
źródło
źródło
os.sendfile()
-based rozwiązanie jest możliwe, zobacz Reproduce the unix cat command in pythonOdpowiedzi:
UPDATE: os.system jest odradzany, chociaż nadal dostępny w Pythonie 3.
Zastosowanie
os.system
:Jeśli naprawdę chcesz użyć podprocesu, oto rozwiązanie (głównie zaczerpnięte z dokumentacji podprocesu):
OTOH, możesz całkowicie uniknąć wywołań systemowych:
źródło
os.system
i umożliwiaos.system
precyzyjne modelowanie , ale jest też bardziej złożona w obsłudze.os.system
przyszedł wcześniejsubprocess
. Pierwszy z nich to starszy interfejs API, który drugi zamierza zastąpić.os.system()
anishell=True
. Aby przekierować wyjście podprocesu, użyjstdout
parametru pokazanego w odpowiedzi Ryana Thompsona . Chociażcat
w twoim przypadku nie potrzebujesz subprocess ( ), możesz łączyć pliki przy użyciu czystego Pythona.W Pythonie 3.5+, aby przekierować dane wyjściowe, po prostu przekaż uchwyt otwartego pliku dla
stdout
argumentu dosubprocess.run
:Jak inni zauważyli, użycie zewnętrznego polecenia, takiego jak
cat
w tym celu, jest całkowicie obce.źródło
subprocess.run(my_cmd, stdout=outfile)
który zastępujesubprocess.call(...)
Oczywiście:
źródło
Kiedy używasz podprocesu , proces musi zostać zabity.To jest przykład.Jeśli nie zabijesz procesu, plik będzie pusty i nie będziesz mógł nic odczytać.Może działać w systemie Windows.Nie mogę się upewnić, że może działa na Uniksie.
źródło
for line in .readlines():
,s +=
) iproc.kill()
może prowadzić do utraty danych w ogóle (to nie pozwala, aby zakończyć podproces wdzięcznie (na Unix) - unflushed zawartość jest tracona ). W każdym razie uwaga o buforowaniu jest bardziej odpowiednia jako komentarz.shlex.split()
, spadekshell=True
, spadek>file
, spadekopen()
, etc i wykorzystaniastdout=PIPE
,Timer(1, proc.terminate).start()
;output = proc.communicate()[0]
zamiast. Oto pełny przykład . Więcej rozwiązań: zatrzymać odczytywanie wyników procesu w Pythonie bez zawieszania się? Uwaga: w pytaniu nie ma wymogu ręcznego zakończenia procesu potomnego - możesz rozwiązać inne problemy, np. Proces może zachowywać się inaczej, jeśli jego standardowym wyjściem jest tty, ale nie dotyczy tematu.Ciekawym przypadkiem byłoby zaktualizowanie pliku przez dołączenie do niego podobnego pliku. Wtedy nie trzeba by było w trakcie tworzenia nowego pliku. Jest to szczególnie przydatne w przypadku konieczności uzupełnienia dużego pliku. Oto jedna możliwość użycia wiersza poleceń teminal bezpośrednio z Pythona.
źródło