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.
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