Chcę przypisać dane wyjściowe polecenia, którego używam, os.system
do zmiennej i zapobiec wyświetlaniu jej na ekranie. Ale w poniższym kodzie dane wyjściowe są wysyłane na ekran, a drukowana wartość var
to 0, co, jak sądzę, oznacza, czy polecenie zostało wykonane poprawnie, czy nie. Czy istnieje sposób przypisania wyniku polecenia do zmiennej, a także zatrzymania jej wyświetlania na ekranie?
var = os.system("cat /etc/services")
print var #Prints 0
os.system
(anios.popen
, zgodnie z zaakceptowaną odpowiedzią): używajsubprocess.Popen
, jest o wiele lepiej!subprocess.Popen
- po prostu dodajshell=True
!shell=True
to (ogólnie) bardzo zły pomysł! Musisz być bardzo pewny tego, co wykonujesz :)Odpowiedzi:
Z „ Equivalent of Bash Backticks in Python ”, o które pytałem dawno temu, możesz chcieć użyć
popen
:Z dokumentacji dla Python 3.6 ,
Oto odpowiedni kod dla
subprocess
:źródło
subprocess.check_output
rozwiązanie Waltera jest bliższe jednoniciowej wersji Pythona, wydaje się, że szukasz, o ile się nie przejmujeszstderr
.os.popen
?shell=True
. Zobacz docs.python.org/3/library/…shell=True
, ale także w tym przypadku jest to nieprawidłowe.shell=True
sprawia, że powłoka proces dziecko zamiastcat
, takout
ierr
są stdout / stderr z muszli procesu zamiast tegocat
procesuMożesz także zajrzeć do
subprocess
modułu, który został zbudowany w celu zastąpienia całej rodzinypopen
wywołań typu Python .Zaletą jest to, że istnieje mnóstwo elastyczności w sposobie wywoływania poleceń, w których połączone są standardowe strumienie wejścia / wyjścia / błędu itp.
źródło
check_output
dodano z python 2.7 docs.python.org/2.7/library/...stderr=subprocess.STDOUT
do przechwytywania standardowych błędówModuł poleceń jest dość wysokim sposobem na zrobienie tego:
status to 0, wyjście to zawartość / etc / services.
źródło
W przypadku python 3.5+ zaleca się użycie funkcji uruchamiania z modułu podprocesu . Zwraca
CompletedProcess
obiekt, z którego można łatwo uzyskać wynik, a także kod powrotu. Ponieważ interesuje Cię tylko wyjście, możesz napisać takie opakowanie narzędzia.źródło
Wiem, że już na nie odpowiedziano, ale chciałem udostępnić potencjalnie lepiej wyglądający sposób dzwonienia do Popena za pomocą
from x import x
funkcji i:źródło
cmd.py
, a następnie w moim głównym pliku napisałemfrom cmd import cmdline
i użyłem go w razie potrzeby.robię to z plikiem temp.s.system:
źródło
Python 2.6 i 3 wyraźnie mówią, aby unikać używania PIPE dla stdout i stderr.
Prawidłowy sposób to
źródło