Comando enmarcado para identificar si Xcode se ejecuta en Mac: cmd = "ps -ax | grep -v grep | grep Xcode"

Si Xcode no se está ejecutando, entonces el comando de arriba funciona bien con Popen método de subprocess módulo, pero plantea una CalledProcessError con check_output método. Traté de inspeccionar el stderr a través del siguiente código, pero no se pudo obtener la información adecuada para entender la razón.

from subprocess import check_output, STDOUT, CalledProcessError

psCmd = "ps -ax | grep -v grep | grep Xcode"
o = None
try:
    o = check_output(psCmd, stderr=STDOUT, shell=True)
except CalledProcessError as ex:
    print 'Error:', ex, o

Mensaje de excepción es la siguiente:

Error: Command 'ps -ax | grep -v grep | grep Xcode' returned non-zero exit status 1 None

Pregunta: ¿por Qué el comando de arriba funciona con Popen, pero no con check_output ?

Nota: el Comando funciona bien con el enfoque, si Xcode está ejecutando.

Es mucho mejor empezar haciendo la grep de procesamiento en Python sí mismo de todos modos.
Incluso si estoy de proceso de la salida en python, tengo que usar subprocess módulo. Así que creo que es una buena manera de obtener todo el trabajo realizado en bash final.
relacionados: Matan a proceso por el nombre en Python

OriginalEl autor Deepak | 2015-02-23

4 Comentarios

  1. 18

    check_output() funciona como se esperaba. Aquí está su implementación simplificada en términos de Popen():

    def check_output(cmd):
        process = Popen(cmd, stdout=PIPE)
        output = process.communicate()[0]
        if process.returncode != 0:
            raise CalledProcessError(process.returncode, cmd, output=output)
        return output

    grep devuelve 1 si no ha encontrado nada que decir, usted debe esperar la excepción si Xcode no se está ejecutando.

    Nota: como la aplicación muestra, usted puede obtener el resultado, incluso si se produce la excepción:

    #!/usr/bin/env python
    from subprocess import check_output, STDOUT, CalledProcessError
    
    cmd = "ps -ax | grep -v grep | grep Xcode"
    try:
        o = check_output(cmd, stderr=STDOUT, shell=True)
        returncode = 0
    except CalledProcessError as ex:
        o = ex.output
        returncode = ex.returncode
        if returncode != 1: # some other error happened
            raise

    Que probablemente podría utilizar pgrep -a Xcode de comandos en lugar de (nota: se inicia con p) o el uso psutil módulo para un portátil código:

    #!/usr/bin/env python
    import psutil # $ pip install psutil
    
    print([p.as_dict() for p in psutil.process_iter() if 'Xcode' in p.name()])
    He entendido bien, ¿por qué check_output se comporta como se comporta. La comprobación de código de retorno es genial. Voy a usar tu idea con errno. Algunos dudas: 1. ¿por Qué tenemos que init returncode en try bloque con el valor 0? 2. No podemos comparar ex.returncode directamente con el valor 1 en if condición? Hace servir a algún propósito, que no he entendido todavía.
    returncode se establece dentro de try/except para 1. mostrar que siempre es cero si check_output() no ha planteado una excepción 2. ambas ramas (con y sin excepción) conjunto de ambas variables: puede utilizar o y returncode después de que el código, independientemente de si Xcode se está ejecutando o no.

    OriginalEl autor jfs

  2. 2

    De Python docs: «Si el código de retorno fue distinto de cero se plantea una CalledProcessError.». Eso es lo que le pasa a usted cuando Xcode no se está ejecutando; el final grep Xcode sale con un estado distinto de cero porque grep no podía encontrar la cadena Xcode que estás buscando. Por lo tanto, check_output() elevará la excepción.

    Por CIERTO, he encontrado esto en el Python subproceso de documentación.

    Yo no veo así. Si ejecuta este comando en la terminal sin Xcode en marcha y verificación de la variable errno, todavía tienen el valor 0. Para comprobar errno he utilizado echo «$?».
    Ummm… cuando intento ps -aef | grep -v grep | grep Xcode ; echo $?, me da como resultado: 1
    que significa que incluso si Xcode no se ha iniciado su comando grep es encontrarlo? El mensaje de Error que se han mostrado Error: Command 'ps -ax | grep -v grep | grep Xcode' returned non-zero exit status 1 None es el resultado de la secuencia de comandos de python, ya que han manejado la excepción en el código
    Terminal de salida cuando Xcode no se está ejecutando $ ps -ax | grep -v grep | grep Xcode $ echo "$?" 0 $ de salida de la Terminal si Xcode está ejecutando $ ps -ax | grep -v grep | grep Xcode 13784 ?? 0:02.34 /Applications/Xcode.app/Contents/MacOS/Xcode $ echo "$?" 0 $ Así que mi punto es, no creo que el código de error 1 es la que viene de aquí en aquí. Me falta algo más.
    Que no debe importar, las comillas son inofensivos (y de hecho es una buena forma, especialmente si usted no está seguro de citar).

    OriginalEl autor Karel Kubat

  3. 1

    Si el comando grep grep Xcode no devuelve ningún resultado, a continuación, el returncode del comando será distinto de cero, por eso check_output está llamando CalledProcessError, que es lo que estamos viendo en la salida de print comando

    Para obtener la salida de los comandos sea el error o éxito utilice el siguiente trozo de código:-

    #!/usr/bin/python
    from subprocess import check_output, STDOUT, CalledProcessError
    
    psCmd = "ps -aef | grep -v grep | grep Xcode"
    o = None
    o = check_output(psCmd+";exit 0", stderr=STDOUT, shell=True)

    check_output sólo le mostrará la salida de la orden si el código de retorno es 0 otra cosa que llama una excepción.

    Por favor, ver mi comentario sobre Karel Kubat la respuesta
    Esa es una buena idea como se muestra en la enlace. Pero, ¿por qué estoy recibiendo el código de error de 1 de secuencia de comandos de python y 0 desde la terminal. De todos modos ahora estoy usando Popen para resolver el problema. Pero la pregunta sigue siendo 🙁
    Tengo mi respuesta. Ahora estoy usando de esta manera. Pero me pregunto ahora, ¿qué pasa si el comando falla por alguna otra razón desconocida. Creo que también pasará por alto debido a exit 0. Es allí una manera de coger esas excepciones.
    Esto no es una sana respuesta. No utilice check_output si usted no desea comprobar el código de resultado del comando.
    exit 0 es malo. Ignora los errores. Puede obtener la salida incluso si una excepción ocurre.

    OriginalEl autor Bad_Coder

  4. 0

    El propósito de check_output es para asegurarse de que el comando se ejecutó completado con éxito. Es supone a fallar si grep Xcode no volver éxito.

    Lo que quieres sería mucho más fácil con la búsqueda en Python, de todos modos.

    output = check_output(['ps', '-ax'], shell=False)
    if 'Xcode' in output:
        print('Xcode appears to be running')

    Esta es la (muy menor) en beneficio de más de la versión de shell que es realmente un error si ps falla por alguna razón. La shell simplemente ignorar el código de salida de ps cuando no en el extremo de una tubería.

    OriginalEl autor tripleee

Dejar respuesta

Please enter your comment!
Please enter your name here