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?
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 acommand -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:Reemplaza
/ruta/a/adb
con la salida del comandowhich adb
en el terminal. El uso del argumentoshell=True
te permite ejecutar el comando en un terminal con acceso al entorno del sistema, incluyendo la variable PATH.