Python os.system problema: “sh: 1: no encontrado”; comando funciona interactivamente

Estoy tratando de ejecutar una llamada al sistema desde Python. Tengo una línea que lee esto en mi script de Python:

return os.system("crux tide-index") 

crux es un progtwig que existe en mi directorio /home/ , y si escribo el comando crux tide-index en un terminal, parece funcionar correctamente.

Cuando ejecuto mi script de Python, llega a la línea de arriba y luego emite esta línea a stderr (es decir, aparece en la salida de mi terminal):

sh: 1: crux not found

No entiendo por qué puedo ejecutar el comando en mi terminal, pero no en una secuencia de comandos de Python. ¿Se me escapa algo? ¿Es posible que el problema sea el hecho de que el crux esté en mi carpeta /home/ ?

Posibles razones

Hay varias razones por las que puedes ejecutar esto en tu terminal, pero no en un script de Python.

  • Podría definirse como un alias.

    Si tiene alias crux=~/crux en su .bashrc o similar, eso explicaría el problema.

  • Podría definirse como una función.

    crux() { ~/crux "$@"; } crux() { ~/crux "$@"; } es un ejemplo de una función de shell que inicia el crux ejecutable. Sin embargo, como cualquier otra función, esto es local al shell en el que está definido. (Bash tiene “funciones exportadas”, pero estas no están disponibles en POSIX sh, y usted necesita salir de su manera de usarlas de todos modos).

  • Podría tener un PATH diferente entre su CLI interactivo y su script.

    Si tiene PATH=$PATH:$HOME en algún lugar de los archivos de puntos de su shell, esto agregará su directorio de inicio a la ubicación en la que se buscan los nuevos ejecutables. Por sí solo, esto se exportará a subprocesos, por lo que se buscará en la instancia /bin/sh iniciada por os.system() en Python, pero si su script está siendo iniciado por cron u otro servicio, no tendría eso. Actualización de PATH.

Depuración

Ejecute el type crux en su shell interactivo. La salida será de la forma de uno de los siguientes:

  • crux is aliased to `/home/kestrel/crux' significa que funciona en su shell interactivo solo debido a un alias. Actualice su RUTA para incluir /home/kestrel , o modifique su secuencia de comandos de Python para calificar completamente la ubicación de la secuencia de comandos.
  • … o si obtienes

     crux is a function crux () { /home/kestrel/crux "$@" } 

    … significa exactamente lo que dice: crux es una función que a su vez invoca /home/kestrel/crux . Luego puedes poner /home/kestrel/crux directamente en tu script de Python.

  • … o si obtiene alguna de:

     crux is hashed (/home/kestrel/crux) 

    o

     crux is /home/kestrel/crux 

    entonces crux está directamente en el PATH para su símbolo del sistema interactivo, pero no para su secuencia de comandos de Python. Edite el PATH asociado con su script apropiadamente.