chiamata della riga di comando di Linux non tornare quello che dovrebbe da os.system?
-
05-10-2019 - |
Domanda
Ho bisogno di fare alcune chiamate da linea di comando per linux e ottenere il ritorno da questo, però facendo come qui sotto è solo tornando 0
quando deve restituire un valore di tempo, come 00:08:19
, sto testando la stessa identica chiamata al comando regolare di linea e restituisce il valore temporale 00:08:19
quindi mi sono confuso quanto a che cosa sto facendo male come ho pensato che questo era come farlo in Python.
import os
retvalue = os.system("ps -p 2993 -o time --no-headers")
print retvalue
Soluzione
Ciò che viene restituito è il valore di ritorno di esecuzione di questo comando. Quello che si vede in durante l'esecuzione direttamente è l'output del comando in stdout. Ciò significa 0 viene restituito, non c'era nessun errore in esecuzione.
Usa popen ecc per catturare l'uscita.
Qualche cosa su questa linea:
import subprocess as sub
p = sub.Popen(['your command', 'arg1', 'arg2', ...],stdout=sub.PIPE,stderr=sub.PIPE)
output, errors = p.communicate()
print output
o
import os
p = os.popen('command',"r")
while 1:
line = p.readline()
if not line: break
print line
ON SO: Popen e pitone
Altri suggerimenti
se siete interessati solo in uscita dal processo, è più facile da usare sottoprocesso check_output funzione:
output = subprocess.check_output(["command", "arg1", "arg2"]);
Poi uscita mantiene l'uscita programma per stdout. Controllare il link qui sopra per ulteriori informazioni.
Il modo più semplice è in questo modo:
import os
retvalue = os.popen("ps -p 2993 -o time --no-headers").readlines()
print retvalue
Questo sarà restituito come una lista ??p>
I tuoi restituisce il codice 0
se l'esecuzione dei comandi passati è pari a zero di successo e non se fallisce. Il seguente programma funziona su python2.7, rifugio controllati 3 e le versioni sopra. Prova questo codice.
>>> import commands
>>> ret = commands.getoutput("ps -p 2993 -o time --no-headers")
>>> print ret
Si è contro-intuitivo e non sembra molto divinatorio, ma in realtà solo imita la progettazione API UNIX, dove questi calld sono funzioni C POSIX. Controllare man 3 popen
&& man 3 system
Un po 'più conveniente frammento di sostituire os.system che uso:
from subprocess import (PIPE, Popen)
def invoke(command):
'''
Invoke command as a new system process and return its output.
'''
return Popen(command, stdout=PIPE, shell=True).stdout.read()
result = invoke('echo Hi, bash!')
# Result contains standard output (as you expected it in the first place).
Non è possibile aggiungere un commento a IonicBurger perché non ho "50 reputazione" in modo Vorrei aggiungere una nuova voce. Mie scuse. os.popen () è il migliore per multipli / comandi complicati (mio parere) e anche per ottenere il valore di ritorno, oltre ad ottenere stdout come i seguenti più complicato più comandi:
import os
out = [ i.strip() for i in os.popen(r"ls *.py | grep -i '.*file' 2>/dev/null; echo $? ").readlines()]
print " stdout: ", out[:-1]
print "returnValue: ", out[-1]
Questo elencherà tutti i file python che hanno la parola 'file' da nessuna parte nel loro nome. Il [...] è una lista di comprensione per rimuovere (striscia) il carattere di nuova riga da ogni voce. Il echo $? è un comando di shell per mostrare lo stato di ritorno dell'ultimo comando eseguito che sarà il comando grep e l'ultimo elemento della lista in questo esempio. 2> / dev / null dice di stampare il stderr della grep> a / dev / null in modo non mostra nell'output. Il 'r' prima di 'ls' il comando è quello di utilizzare la stringa grezzo in modo che la shell non interpreterà metacaratteri come '*' in modo non corretto. Questo funziona in Python 2.7. Ecco l'output di esempio:
stdout: ['fileFilter.py', 'fileProcess.py', 'file_access..py', 'myfile.py']
returnValue: 0
Questo è un vecchio thread, ma puramente utilizzando os.system
, quanto segue è un modo valido di accedere ai dati restituiti dalla chiamata ps
. Nota: si fa uso di un tubo di scrivere i dati in un file su disco. e OP non ha specificamente chiesto una soluzione che utilizza os.system
.
>>> os.system("ps > ~/Documents/ps.txt")
0 #system call is processed.
>>> os.system("cat ~/Documents/ps.txt")
PID TTY TIME CMD
9927 pts/0 00:00:00 bash
10063 pts/0 00:00:00 python
12654 pts/0 00:00:00 sh
12655 pts/0 00:00:00 ps
0
di conseguenza,
>>> os.system("ps -p 10063 -o time --no-headers > ~/Documents/ps.txt")
0
>>> os.system("cat ~/Documents/ps.txt")
00:00:00
0
Non ho idea perché essi sono tutti zeri tornando però.
Per la vostra esigenza, la funzione Popen del modulo sottoprocesso pitone è la risposta. Ad esempio,
import subprocess
..
process = subprocess.Popen("ps -p 2993 -o time --no-headers", stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout, stderr = process.communicate()
print stdout
okey Credo che il modo più veloce sarebbe
import os
print(os.popen('command').readline())
x = _
print(x)
using commands module
import commands
"""
Get high load process details
"""
result = commands.getoutput("ps aux | sort -nrk 3,3 | head -n 1")
print result -- python 2x
print (result) -- python 3x