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
È stato utile?

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

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 
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top