J'ai un répertoire plein de scripts (disons project/bin
). J'ai également une bibliothèque située dans project/lib
et je souhaite que les scripts la chargent automatiquement. C'est ce que j'utilise normalement en haut de chaque script:
#!/usr/bin/python
from os.path import dirname, realpath, sep, pardir
import sys
sys.path.append(dirname(realpath(__file__)) + sep + pardir + sep + "lib")
# ... now the real code
import mylib
C'est un peu encombrant, moche et doit être collé au début de chaque fichier. Y a-t-il une meilleure manière de faire cela?
Ce que j'espère vraiment, c'est quelque chose d'aussi simple que ceci:
#!/usr/bin/python
import sys.path
from os.path import pardir, sep
sys.path.append_relative(pardir + sep + "lib")
import mylib
Ou encore mieux, quelque chose qui ne casserait pas lorsque mon éditeur (ou quelqu'un d'autre qui a un accès de validation) décide de réorganiser les importations dans le cadre de son processus de nettoyage:
#!/usr/bin/python --relpath_append ../lib
import mylib
Cela ne porterait pas directement sur des plates-formes non-posix, mais cela garderait les choses propres.
python
python-import
James Harr
la source
la source
Réponses:
Si vous ne souhaitez pas modifier chaque fichier
ou
PYTHONPATH
votrelib
ou si vous souhaitez ajouter une seule ligne à chaque fichier, ajoutez une instruction d'importation en haut, par exemple
garder
import_my_lib.py
dans le bac etimport_my_lib
peut correctement définir le chemin python sur ce quelib
vous voulezla source
C'est ce que j'utilise:
la source
__file__
est un nom de fichier relatif par rapport au répertoire de travail actuel (par exemple,setup.py
), alorsos.path.dirname(__file__)
sera la chaîne vide. Pour cela et des préoccupations similaires soulevées par John Jiang , ekhumoro « est une solution plus polyvalente est fortement préférable.J'utilise:
la source
sys.path.append('.')
__file__
place comme n'importe quel développeur quasi-sain d'esprit.Créez un module wrapper
project/bin/lib
, qui contient ceci:Ensuite, vous pouvez remplacer tout ce qui se trouve en haut de vos scripts par:
la source
Si vous ne souhaitez en aucun cas modifier le contenu du script, ajoutez le répertoire de travail actuel
.
à $ PYTHONPATH (voir l'exemple ci-dessous)Et appelez ça un jour!
la source
Utilisation de python 3.4+ Interdiction de
l'utilisation de cx_freeze ou utilisation en IDLE. 😃
la source
Vous pouvez exécuter le script à
python -m
partir du répertoire racine approprié. Et passez le "chemin des modules" comme argument.Exemple:
$ python -m module.sub_module.main # Notice there is no '.py' at the end.
Un autre exemple:
la source
Il y a un problème avec chaque réponse fournie qui peut être résumé comme "ajoutez simplement cette incantation magique au début de votre script. Voyez ce que vous pouvez faire avec juste une ligne ou deux de code." Ils ne fonctionneront pas dans toutes les situations possibles!
Par exemple, une telle incantation magique utilise le fichier . Malheureusement, si vous empaquetez votre script avec cx_Freeze ou si vous utilisez IDLE, cela entraînera une exception.
Une autre incantation magique de ce type utilise os.getcwd (). Cela ne fonctionnera que si vous exécutez votre script à partir de l'invite de commande et que le répertoire contenant votre script est le répertoire de travail actuel (c'est-à-dire que vous avez utilisé la commande cd pour accéder au répertoire avant d'exécuter le script). Eh dieux! J'espère que je n'ai pas à expliquer pourquoi cela ne fonctionnera pas si votre script Python est quelque part dans le PATH et que vous l'avez exécuté en tapant simplement le nom de votre fichier de script.
Heureusement, il existe une incantation magique qui fonctionnera dans tous les cas que j'ai testés. Malheureusement, l'incantation magique est plus qu'une simple ligne ou deux de code.
Comme vous pouvez le voir, ce n'est pas une tâche facile!
la source
Celui-ci fonctionne le mieux pour moi. Utilisation:
Sur mac, il devrait imprimer quelque chose comme:
Pour obtenir le chemin abs vers le wd actuel, celui-ci est meilleur car maintenant vous pouvez monter si vous le souhaitez, comme ceci:
Et maintenant:
Donc, si vous voulez importer à
utils
partir d'ici,'/Users/<your username>/'
il ne vous reste plus qu'à:
la source
Je vois un shebang dans votre exemple. Si vous exécutez vos scripts bin en tant que
./bin/foo.py
, plutôt quepython ./bin/foo.py
, il y a une option d'utiliser le shebang pour changer la$PYTHONPATH
variable.Cependant, vous ne pouvez pas modifier les variables d'environnement directement dans shebangs, vous aurez donc besoin d'un petit script d'aide. Mettez ceci
python.sh
dans votrebin
dossier:Et puis changez le shebang de votre
./bin/foo.py
être#!bin/python.sh
la source
Lorsque nous essayons d'exécuter un fichier python avec le chemin du terminal.
Enregistrez le fichier (test.py).
Système de fonctionnement.
Ouvrez le terminal et accédez au répertoire où se trouve le fichier de sauvegarde. puis écrire
Appuyez sur Entrée
Production:
la source
J'utilise:
Ensuite, peut utiliser n'importe quel répertoire relatif!
addsitedir('..\lib')
; les deux points impliquent de déplacer (vers le haut) un répertoire en premier.N'oubliez pas que tout dépend de votre répertoire de travail actuel. Si C: \ Joe \ Jen \ Becky, alors ajouteitedir ('.. \ lib') importe dans votre chemin C: \ Joe \ Jen \ lib
la source