[LINUX] Je veux dire aux gens qui souhaitent importer depuis un répertoire supérieur avec Python direnv

Le problème que vous souhaitez résoudre dans cet article

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.

Faiblesses de sys.path.append

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.

Mon environnement de développement

OS:macOS Catalina 10.15.6 brew 2.5.2 bash : 3.2.57(1)-release (x86_64-apple-darwin19) Python : 3.6.10

Structure de dossier utilisée dans cette explication

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)

Installez direnv

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

Rendre direnv disponible

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.

Qu'est-ce que PYTHONPATH?

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)

(Uniquement pour ceux qui en ont besoin) Si vous souhaitez écrire des variables d'environnement en .env

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/

Vérifiez le fonctionnement de direnv

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

résolu

Maintenant, exécutez me.py fonctionne bien.

$ python mother/me.py
name : Reon
age : 14

Fonctionnement de .envrc

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.

(Supplément) Présentez direnv à Amazon Linux

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

Environnement Amazon Linux

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

Article de référence

Recommended Posts

Je veux dire aux gens qui souhaitent importer depuis un répertoire supérieur avec Python direnv
Je souhaite utiliser le répertoire temporaire avec Python2
Je veux écrire dans un fichier avec Python
Je veux travailler avec un robot en python.
Je veux faire fonctionner un ordinateur quantique avec Python
[Python] Je veux ajouter un répertoire statique avec Flask [Je veux utiliser autre chose que statique]
Je veux installer le package de requirements.txt avec poésie
Je souhaite envoyer un message de Python à LINE Bot
Je veux déboguer avec Python
Je souhaite utiliser un caractère générique que je souhaite décortiquer avec Python remove
Je souhaite rechercher le texte intégral avec elasticsearch + python
[Introduction] Je veux créer un robot Mastodon avec Python! 【Débutants】
Je veux utiliser jar de python
Je veux créer un environnement Python
Je veux analyser les journaux avec Python
Je veux jouer avec aws avec python
[Mémo Python] Je souhaite obtenir un nombre hexadécimal à 2 chiffres à partir d'un nombre décimal
J'ai essayé de créer un environnement de développement Mac Python avec pythonz + direnv
Je veux utiliser MATLAB feval avec python
Je souhaite envoyer un e-mail depuis Gmail en utilisant Python.
Je veux utiliser le solveur ceres de python
#Unresolved Je veux compiler gobject-introspection avec Python3
Je veux résoudre APG4b avec Python (chapitre 2)
[Python] Je veux gérer 7DaysToDie depuis Discord! 2/3
Je veux créer du code C ++ à partir de code Python!
Je souhaite intégrer une variable dans une chaîne Python
Je veux facilement implémenter le délai d'expiration en python
Je veux répéter plusieurs fois un générateur Python
Je veux générer rapidement UUID (memo memo) ~ Edition Python ~
Je veux faire la transition avec un bouton sur le ballon
Je veux gérer l'optimisation avec python et cplex
Je veux escalader une montagne avec l'apprentissage par renforcement
Je veux écrire en Python! (2) Écrivons un test
J'ai créé un environnement Python3 sur Ubuntu avec direnv.
Je veux échantillonner au hasard un fichier avec Python
Je veux hériter de l'arrière avec la classe de données python
De l'achat d'un ordinateur à l'exécution d'un programme sur python
Je veux diviser une chaîne de caractères avec hiragana
[Python] Je veux faire d'une liste imbriquée un taple
Je veux AWS Lambda avec Python sur Mac!
Je souhaite créer manuellement une légende avec matplotlib
Pour ceux qui veulent écrire Python avec vim
Je veux lier une variable locale avec lambda
Un véritable moyen pour les personnes utilisant python 3.8.0-2 à partir de Windows de travailler avec des caractères multi-octets
[Python] J'ai créé un système pour introduire "la recette que je veux vraiment" depuis le site de recettes!
[Mac] Je souhaite créer un serveur HTTP simple qui exécute CGI avec Python
Créer un répertoire avec python
Je souhaite supprimer l'avertissement d'importation non résolue de Python avec vsCode
Je souhaite spécifier une autre version de Python avec pyvenv
Je veux pouvoir analyser des données avec Python (partie 1)
J'ai créé un package pour filtrer les séries chronologiques avec python
J'ai écrit rapidement un programme pour étudier la DI avec Python ①
Je veux créer un éditeur de blog avec l'administrateur de django
Je veux démarrer un environnement Jupyter avec une seule commande
[Python] Je souhaite obtenir un ensemble commun entre numpy
Je veux faire une macro de clic avec pyautogui (désir)
Je veux pouvoir analyser des données avec Python (partie 4)