J'ai décidé d'organiser les dossiers de fichiers python qui avaient été placés correctement jusqu'à présent, car le projet devenait plus grand. Le problème qui s'est produit ici était que je ne pouvais pas importer ma propre bibliothèque. En python, seuls le dossier d'exécution et les dossiers situés sous celui-ci constituent le chemin à rechercher pour les modules, vous ne pouvez donc pas importer à partir de fichiers au-dessus de vous.
Jusqu'à présent, j'ai utilisé sys.path.append pour importer à partir du fichier supérieur, mais il présente les inconvénients suivants et je me demande s'il existe un moyen de le résoudre sans utiliser sys.path.append. fait.
Lorsque j'essaie d'importer à partir d'un fichier de niveau supérieur en utilisant sys.path.append, les premières lignes du fichier ressemblent toujours à ceci:
import sys
import pathlib
sys.path.append(str(pathlib.Path(__file__).resolve().parents[1]))
from MyModule.MyClass import MyClass
Ce que je déteste, c'est
C'est le but. C'est forcément contraire à l'idéal d'écrire du code propre.
Direnv résout un tel problème cette fois. direnv est un outil qui définit les variables d'environnement dans .envrc pour chaque répertoire et n'active les variables d'environnement que lorsque le répertoire où se trouve .envrc devient le répertoire courant.
OS:macOS Catalina 10.15.6 brew 2.5.2 bash : 3.2.57(1)-release (x86_64-apple-darwin19) Python : 3.6.10
grand_mother
┣ mother
┃ ┗ me.py
┗ aunt
┗ cousin.py
L'explication est basée sur l'hypothèse que «cousin.py» est importé et utilisé dans «me.py». «me.py» et «cousin.py» sont les suivants.
cousin.py
class Cousin:
name = 'Reon'
age = 14
me.py
from aunt.cousin import Cousin
print('name :', Cousin.name)
print('age :', Cousin.age)
Pour Mac, une commande de brassage.
$ brew install direnv
Si vous n'êtes pas sur un Mac, git clonez-le.
$ cd /path/to/directory #Où vous souhaitez installer
$ git clone https://github.com/direnv/direnv
$ cd direnv
$ sudo make install
Ajoutez un crochet pour bash.
~/.bashrc
eval "$(direnv hook bash)"
Rechargez ~ / .bashrc pour que direnv fonctionne.
$ source ~/.bashrc
Allez en haut du projet où vous souhaitez définir les variables d'environnement (dans ce cas grand_mère /) et exécutez la commande suivante:
$ cd 〇〇/grand_mother
$ direnv edit .
Ensuite, grand_mère / .envrc sera créé, alors ajoutez PYTHONPATH.
grand_mother/.envrc
export PYTHONPATH="〇〇/grand_mother:$PYTHONPATH"
Vous pouvez maintenant faire des choses comme from mother import
et from tunt import
dans les fichiers de grand_mother.
PYTHONPATH ajoute un répertoire pour rechercher des modules en plus des modules python par défaut lorsque python charge les modules. Vous pouvez vérifier le PYTHONPATH actuellement défini avec la commande suivante.
#Vérifiez PYTHON PATH
$ echo $PYTHONPATH
#Afficher toutes les variables d'environnement, y compris PYTHON
$ printenv | grep PYTHON
De plus, si vous voulez voir tous les répertoires que python charge lors du chargement des modules, vous pouvez vérifier le sys.path de python.
import sys
print(sys.path)
En utilisant cet article comme référence, j'expliquerai également comment écrire des variables d'environnement vers grand_mother / .env
. J'ai choisi cette méthode car j'avais déjà écrit d'autres variables d'environnement en .env.
C'est tout pour .envrc.
grand_mother/.envrc
dotenv
Ajoutons la phrase suivante à .env.
grand_mother/.env
PYTHONPATH=/〇〇/grand_mother/
Après avoir défini .envrc
direnv: error .envrc is blocked. Run `direnv allow` to approve its content.
Vous pouvez voir une déclaration d'erreur comme celle-ci. A ce moment, exécutez direnv allow
comme indiqué dans l'instruction d'erreur et confirmez que PYTHONPATH a été ajouté. Cette phrase s'affiche chaque fois que vous réécrivez .envrc.
$ direnv allow
direnv: loading ~/〇〇/grand_mother/.envrc
direnv: export +PYTHONPATH
Si vous quittez le répertoire où se trouve .envrc, direnv sera temporairement désactivé.
$ cd ..
direnv: unloading
Une fois encore, lorsque vous entrez dans le répertoire où se trouve .envrc, vous verrez que le contenu de .envrc a été ajouté aux variables d'environnement.
$ cd grand_mother/
direnv: loading .envrc
Maintenant, exécutez me.py fonctionne bien.
$ python mother/me.py
name : Reon
age : 14
Lors du partage du code source sur GitHub, etc., .env et .envrc contiennent des informations qui devraient être volées. Ou vous devrez peut-être définir des valeurs différentes en fonction de l'environnement d'exécution, alors ne vous engagez pas dans le référentiel en ajoutant .envrc à .gitignore.
Cette fois, j'ai dû mettre direnv dans Amazon Linux que j'exploitais selon mon local, donc j'écrirai le contenu du travail à ce moment-là.
$ cat /etc/os-release
Amazon Linux AMI 2018.03
$ bash --version
GNU bash,Version 4.2.46(2)-release (x86_64-redhat-linux-gnu)
Tout d'abord, Amazon Linux n'inclut pas go to run direnv, vous devez donc l'installer.
$ sudo yum install golang -y
Ensuite, git clone et installez direnv comme indiqué en haut de cet article.
$ cd /path/to/directory #Où vous souhaitez installer
$ git clone https://github.com/direnv/direnv
$ cd direnv
$ sudo make install
Ajoutez les hooks GOPATH et direnv à bash. GOPATH spécifie l'emplacement de la construction, vous pouvez donc utiliser n'importe quel emplacement.
~/.bashrc
export GOPATH=$HOME/go
eval "$(direnv hook bash)"
Rechargeons ~ / .bashrc et vérifions le résultat du réglage.
$ source ~/.bashrc
$ echo $GOPATH
/home/ec2-user/go
Après cela, vous pouvez désormais utiliser direnv sur Amazon Linux en suivant la méthode ** Enable direnv ** décrite en haut de l'article.
Recommended Posts