Python Script wykonuje polecenia w Terminalu

109

Czytałem to gdzieś jakiś czas temu, ale nie mogę tego znaleźć. Próbuję znaleźć polecenie, które wykona polecenia w terminalu, a następnie wyprowadzi wynik.

Na przykład: skrypt będzie wyglądał następująco:

command 'ls -l'

Okaże wynik uruchomienia tego polecenia w terminalu

Ali
źródło

Odpowiedzi:

198

Można to zrobić na kilka sposobów:

Prostym sposobem jest użycie modułu os:

import os
os.system("ls -l")

Bardziej złożone rzeczy można osiągnąć za pomocą modułu podprocesu: na przykład:

import subprocess
test = subprocess.Popen(["ping","-W","2","-c", "1", "192.168.1.70"], stdout=subprocess.PIPE)
output = test.communicate()[0]
Uku Loskit
źródło
43
Nie chcę cię osłabiać, ale. Powinieneś używać podprocesu do wszystkiego. To jest o wiele bezpieczniejsze. subprocess.call () zapewni ładny interfejs, który zastąpi prosty formularz wywołania.
Jorge Vargas
Dzięki za tę odpowiedź kolego. Będę używać Pythona w mojej pierwszej aplikacji na pulpicie Ubuntu, to naprawdę mi pomoże.
LinuxBill,
1
Jak mogę uzyskać pełną odpowiedź na polecenie, os.system("nslookup gmail.com")zwraca tylko ostatnią linię 0, ale chcę uzyskać pełną odpowiedź.
Parthapratim Neog
3
@JorgeVargas Czy możesz mi pomóc zrozumieć, dlaczego podproces powinien być używany do wszystkiego? Dlaczego to jest bezpieczniejsze?
Soutzikevich
38

Preferuję użycie modułu subprocess:

from subprocess import call
call(["ls", "-l"])

Powodem jest to, że jeśli chcesz przekazać jakąś zmienną w skrypcie daje to bardzo łatwy sposób na przykład weź następną część kodu

abc = a.c
call(["vim", abc])
Kevin Pandya
źródło
Udało mi się otworzyć zdjęcie z dodatkowymi parametramicall(["eog", "1breeproposal.png", "-f"])
Josh
4

Powinieneś także zajrzeć do commands.getstatusoutput

Zwraca krotkę o długości 2. Pierwsza to zwracana liczba całkowita (0 - gdy komendy się powiodły), druga to całe wyjście, jak zostanie pokazane na terminalu.

Dla ls

    import commands
    s=commands.getstatusoutput('ls')
    print s
    >> (0, 'file_1\nfile_2\nfile_3')
    s[1].split("\n")
    >> ['file_1', 'file_2', 'file_3']
minocha
źródło
2
import os
os.system("echo 'hello world'")

To powinno działać. Nie wiem, jak wydrukować dane wyjściowe w powłoce Pythona.

Mr_pzling_Pie
źródło
1

Funkcja os.popen () jest dość prosta w użyciu, ale została wycofana od czasu Pythona 2.6. Powinieneś użyć podprocesu modułu .

Przeczytaj tutaj: wczytywanie os.popen (polecenie) do łańcucha

Paolo Rovelli
źródło
1

Jupyter

W notebooku jupyter możesz użyć magicznej funkcji !

!echo "execute a command"
files = !ls -a /data/dir/ #get the output into a variable

ipython

Aby wykonać to jako .pyskrypt, musisz użyćipython

files = get_ipython().getoutput('ls -a /data/dir/')

wykonaj skrypt

$ ipython my_script.py
Zephro
źródło
0

Możesz zaimportować moduł „os” i używać go w następujący sposób:

import os
os.system('#DesiredAction')
Kobe Keirouz
źródło
0

dla python3 użyj podprocesu

import subprocess
s = subprocess.getstatusoutput(f'ps -ef | grep python3')
print(s)
Avi Avidan
źródło