393 votes

Importations de paquets frères

J'ai essayé de lire les questions sur les importations entre frères et soeurs et même la documentation du paquet mais je n'ai pas encore trouvé de réponse.

Avec la structure suivante :

 LICENSE.md
 README.md
 api
    __init__.py
    api.py
    api_key.py
 examples
    __init__.py
    example_one.py
    example_two.py
 tests
    __init__.py
    test_one.py

Comment les scripts dans les examples y tests importés des répertoires api et être exécuté à partir de la ligne de commande ?

Aussi, j'aimerais éviter l'horrible sys.path.insert hack pour chaque fichier. Sûrement cela peut être fait en Python, non ?

1voto

ADataGMan Points 165

J'ai créé un projet d'exemple pour démontrer comment je gère cela, qui est en effet un autre hack sys.path comme indiqué ci-dessus. Exemple d'importation de frères et sœurs en Python qui s'appuie sur :

if __name__ == '__main__': import os import sys sys.path.append(os.getcwd())

Cela semble être assez efficace tant que votre répertoire de travail reste à la racine du projet Python.

1voto

jerry_ Points 41

Je voulais faire un commentaire sur le solution fourni par np8 mais je n'ai pas assez de réputation donc je vais juste mentionner que vous pouvez créer un fichier setup.py exactement comme ils l'ont suggéré, et ensuite faire pipenv install --dev -e . du répertoire racine du projet pour le transformer en une dépendance modifiable. Ensuite, vos importations absolues fonctionneront, par exemple from api.api import foo et vous n'avez pas à vous embêter avec des installations dans tout le système.

Documentation

1voto

John Points 11

Si vous utilisez pytest, alors l'option documentation sur pytest décrire une méthode permettant de référencer les paquets sources à partir d'un paquet de test distinct.

La structure de répertoire suggérée pour le projet est la suivante :

setup.py
src/
    mypkg/
        __init__.py
        app.py
        view.py
tests/
    __init__.py
    foo/
        __init__.py
        test_view.py
    bar/
        __init__.py
        test_view.py

Contenu de la setup.py fichier :

from setuptools import setup, find_packages

setup(name="PACKAGENAME", packages=find_packages())

Installez les paquets dans éditable mode :

pip install -e .

Les références de l'article de pytest ce blog post par Ionel Cristian Mărieș .

-1voto

akash Points 399

dans votre fichier principal, ajoutez ceci :

import sys
import os 
sys.path.append(os.path.abspath(os.path.join(__file__,mainScriptDepth)))

mainScriptDepth = la profondeur du fichier principal à partir de la racine du projet.

Voici votre cas mainScriptDepth = "../../" . Ensuite, vous pouvez importer en spécifiant le chemin ( from api.api import * ) à partir de la racine de votre projet.

-2voto

Wahyu Bram Points 41

Pour la question principale :

appeler le dossier frère en tant que module :

from .. import siblingfolder

appeler a_file.py du dossier frère en tant que module :

from ..siblingfolder import a_file

appeler une_fonction à l'intérieur d'un fichier dans un dossier frère comme le module :

from..siblingmodule.a_file import func_name_exists_in_a_file

Le moyen le plus simple.

allez dans le dossier lib/site-packages.

si le fichier 'easy_install.pth' existe, il suffit de l'éditer et d'ajouter le répertoire dans lequel vous avez script que vous voulez transformer en module.

s'il n'existe pas, créez-en un... et mettez-y le dossier que vous voulez.

après l'avoir ajouté..., python percevra automatiquement ce dossier comme similaire à site-packages et vous pourrez appeler chaque script de ce dossier ou sous-dossier comme un module.

j'ai écrit ceci avec mon téléphone, et j'ai eu du mal à le mettre en place pour que tout le monde soit à l'aise pour le lire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X