Cómo cambiar el directorio de trabajo de un script de shell

Cómo cambiar el directorio de trabajo de un script de shell

Tengo un script de Python que busca archivos en un directorio relativo. Por ejemplo: el script Python está en formato /home/username/projectname/. Tengo un archivo que se llama dentro del script de Python que está en formato /home/username/projectname/subfolder.

Si ejecuto el script desde el shell, python scriptname.pyfunciona perfectamente bien.

Sin embargo, estoy intentando ejecutar el script como un servicio de inicio. Lo estoy configurando en webmin y creo que está creando un script de shell para llamarlo. A través del script de inicio, estoy haciendo algo como esto para llamar al script:

execute python home/username/projectname/scriptname.py

El script se inicia bien, pero no puede acceder a los archivos en el directorio relativo.

Supongo que hay una mejor manera de llamar al programa Python desde el script de inicio para conocer la ruta relativa.

Respuesta1

Rápido y sucio:

En su script de inicio, en lugar de simplemente ejecutar el script de Python, use cdprimero.

#!/bin/sh

cd /home/username/projectname &&
python ./scriptname.py

Respuesta2

Hay un par de formas de solucionar esto directamente en su secuencia de comandos Python.

  1. Si su script siempre estará en "/home/nombre de usuario/nombre de proyecto/subcarpeta", simplemente puede agregarlo a su ruta de búsqueda dentro de Python:

    import sys
    sys.path.append("/home/username/projectname/subfolder")
    

    Sospecho, sin embargo, que es posible que tenga esto en varios directorios de "nombre de proyecto", por lo que una solución más genérica es algo como esto:

    import sys
    import os
    sys.path.append(os.path.join(os.path.dirname(sys.argv[0]), "subfolder"))
    

    Esto encuentra el directorio donde está el script Python (en sys.argv[0]), extrae la parte del directorio, le agrega "subcarpeta" y la coloca en la ruta de búsqueda.

    Tenga en cuenta que es posible que algunos sistemas operativos solo proporcionen el nombre del ejecutable en formato sys.argv[0]. No tengo una buena solución para este caso, quizás alguien más la tenga. Es posible que también necesites inyectar una os.path.abspath()llamada allí si sys.argv[0]tiene una ruta relativa, pero juega un poco con ella y deberías poder hacer que funcione.

  2. De manera similar a la respuesta anterior, puede hacer que el script de Python cambie los directorios por sí solo sin necesidad de un script contenedor:

    import os
    os.chdir("/home/username/projectname")
    

Respuesta3

Una forma aún más rápida y sucia de hacerlo (con una subcapa):

( cd my/path/to/folder && python myprogram.py )

Respuesta4

set PYTHONPATH=PROJECTPATH && python script.py

información relacionada