Python Script esegue i comandi nel terminale


109

L'ho letto da qualche parte qualche tempo fa ma non riesco a trovarlo. Sto cercando di trovare un comando che eseguirà i comandi nel terminale e quindi produrrà il risultato.

Ad esempio: lo script sarà:

command 'ls -l'

Mostrerà il risultato dell'esecuzione di quel comando nel terminale

Risposte:


198

Ci sono diversi modi per farlo:

Un modo semplice è usare il modulo os:

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

Cose più complesse possono essere ottenute con il modulo sottoprocesso: ad esempio:

import subprocess
test = subprocess.Popen(["ping","-W","2","-c", "1", "192.168.1.70"], stdout=subprocess.PIPE)
output = test.communicate()[0]

43
Non voglio sottovalutarti ma. Dovresti usare sottoprocesso per tutto. È molto più sicuro. subprocess.call () ti fornirà una bella interfaccia per sostituire il semplice form di chiamata.
Jorge Vargas

Grazie per quella risposta amico. Userò python per la mia prima applicazione sul desktop di Ubuntu, questo mi aiuterà davvero.
LinuxBill

1
Come posso ottenere la risposta completa di un comando, os.system("nslookup gmail.com")restituisce solo l'ultima riga 0, ma voglio ottenere la risposta completa.
Parthapratim Neog

3
@JorgeVargas Puoi aiutarmi a capire perché il sottoprocesso dovrebbe essere usato per tutto? Perché è più sicuro?
Soutzikevich

38

Preferisco l'utilizzo del modulo sottoprocesso:

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

Il motivo è che se vuoi passare qualche variabile nello script questo offre un modo molto semplice per esempio prendere la seguente parte del codice

abc = a.c
call(["vim", abc])

Ha funzionato bene per me aprendo un'immagine con parametri extracall(["eog", "1breeproposal.png", "-f"])
Josh


4

Dovresti anche esaminare commands.getstatusoutput

Questo restituisce una tupla di lunghezza 2 .. Il primo è il numero intero di ritorno (0 - quando i comandi hanno successo), il secondo è l'intero output come verrà mostrato nel terminale.

Per 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']

2
import os
os.system("echo 'hello world'")

Questo dovrebbe funzionare. Non so come stampare l'output nella shell python.



1

Jupyter

In un quaderno jupyter puoi usare la funzione magica !

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

ipython

Per eseguirlo come uno .pyscript dovresti usareipython

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

eseguire lo script

$ ipython my_script.py

0

Puoi importare il modulo 'os' e usarlo in questo modo:

import os
os.system('#DesiredAction')

0

per python3 usa subprocess

import subprocess
s = subprocess.getstatusoutput(f'ps -ef | grep python3')
print(s)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.