es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

FileNotFoundError en subprocess.check_output

Quiero conectar y usar las funciones de adb en un entorno de Python.
En la terminal, adb está conectado correctamente como se muestra a continuación.

$ adb --version
Android Debug Bridge version 1.0.41
Versión 31.0.3-7562133
Instalado en /opt/homebrew/bin/adb
$ command -v adb
/opt/homebrew/bin/adb

Para usarlo en el entorno de Python, se utilizó subprocess.check_output.
Escribí el código en Python de la siguiente manera.

import subprocess

cmd = f"adb --version"
print(f"cmd:{cmd}")
res = subprocess.check_output(cmd).decode("utf-8")
print(f"res:{res}")

Obtuve un error como se muestra a continuación.

$ python test.py
cmd:adb --version
Traceback (most recent call last):
  File "/Users/hhd/project/hhdpy/test.py", line 5, in <module>
    res = subprocess.check_output(cmd).decode("utf-8")
  File "/opt/homebrew/anaconda3/envs/hhdpy/lib/python3.9/subprocess.py", line 424, in check_output
    return run(*popenargs, stdout=PIPE, timeout=timeout, check=True,
  File "/opt/homebrew/anaconda3/envs/hhdpy/lib/python3.9/subprocess.py", line 505, in run
    with Popen(*popenargs, **kwargs) as process:
  File "/opt/homebrew/anaconda3/envs/hhdpy/lib/python3.9/subprocess.py", line 951, in __init__
    self._execute_child(args, executable, preexec_fn, close_fds,
  File "/opt/homebrew/anaconda3/envs/hhdpy/lib/python3.9/subprocess.py", line 1821, in _execute_child
    raise child_exception_type(errno_num, err_msg, err_filename)
FileNotFoundError: [Errno 2] No existe el archivo o el directorio: 'adb --version'

En mi opinión, parece que subprocess.check_output no puede importar la variable de entorno PATH.
¿Cómo debería resolverlo?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para resolver el problema, puedes especificar la ruta completa del archivo ejecutable adb en el argumento del comando en lugar de depender de la variable de entorno PATH del sistema. Puedes utilizar el comando which (equivalente a command -v utilizado en el terminal) para obtener la ruta completa del archivo ejecutable adb y utilizarlo en el argumento del comando de la siguiente manera:

    import subprocess
    
    cmd = "/ruta/a/adb --version"
    print(f"cmd:{cmd}")
    res = subprocess.check_output(cmd, shell=True).decode("utf-8")
    print(f"res:{res}")
    

    Reemplaza /ruta/a/adb con la salida del comando which adb en el terminal. El uso del argumento shell=True te permite ejecutar el comando en un terminal con acceso al entorno del sistema, incluyendo la variable PATH.

Comments are closed.