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.py
funciona 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 cd
primero.
#!/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.
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 unaos.path.abspath()
llamada allí sisys.argv[0]
tiene una ruta relativa, pero juega un poco con ella y deberías poder hacer que funcione.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