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.