web-dev-qa-db-fra.com

python 3.x exécuter le script avec les scripts liés ubuntu

J'ai créé une structure de dossiers et de fichiers pour faciliter la maintenance et la flexibilité de mon projet dans le temps.

J'ai stocké ces tas de dossiers et de scripts python sous cette forme:

/home/ubuntu/main_folder: dans ce dossier j'ai le schéma:

     |-main_foler
     |
     |-module1
     |---script.py
     |
     |configetl
     |---config.py
     |
     |process.sh

J'ai hâte d'exécuter le script stocké dans le dossier module1 sous le nom script.py avec le script exécutable process.sh:

     #!/bin/sh
     cd /home/ubuntu/main_folder &&

     python3 module1/script.py

Le problème survient lorsque le script est exécuté car utilise un tas de méthodes provenant d'un script stocké dans le dossier appelé configetl.

        error: File "module1/script.py", line 4, in <module>
          from configetl.config import *
        ImportError: No module named 'configetl'

Comment dois-je définir correctement mon script sh pour éviter cela et planifier ce script automatiquement dans un cron?

merci beaucoup.

1
Andres Angel

Votre script.py Ne peut probablement pas accéder au config.py, Car le répertoire configetl n'est pas dans le PYTHONPATH de script.py.

Vous pouvez tester cela en imprimant la liste sys.path Dans votre script.py Lorsqu'elle est appelée à partir du script process.sh.

# Inside your script.py before calling any config functions
import sys
print(sys.path)

La sortie doit être similaire à ceci:

['', '/usr/lib/python36.Zip', '/usr/lib/python3.6', '/usr/lib/python3.6/lib-dynload', '/usr/lib/python3.6/site-packages']

Pour inclure le répertoire configetl dans votre PYTHONPATH et le rendre visible au script.py, Vous devez ajouter le chemin d'accès au configetl à la liste sys.path:

# Inside your script.py before calling any config functions
import sys
sys.path.append('../')

Cela ajoutera l'intégralité du répertoire de niveau supérieur à votre PYTHONPATH.

Si vous souhaitez ajouter uniquement le répertoire configetl à votre PYTHONPATH, vous pouvez faire:

# Inside your script.py before calling any config functions
import sys
sys.path.append('../configetl')

Cela nécessitera de petites modifications dans la façon dont vous importez le module config.py. Vous devrez l'importer directement, sans son nom de répertoire parent, par exemple.

from config import *

P.S. Utiliser le symbole étoile pour tout importer à partir d'un module python est considéré comme une mauvaise pratique. Vous devez soit importer le module entier import config Soit répertorier les objets à partir desquels vous souhaitez importer ce module, par exemple from config import function_one, function_two

2
haralambov