2017-09-26 4 views
1

Alors, voici mon (ok .. désordre) dir:python 101 - le meilleur moyen d'accéder à un module de dossier parent

. 
├── app 
│   ├── __init__.py 
│   ├── analyze_text.py 
│   ├── images.py 
│   ├── main.py 
│   ├── messages.py 
│   ├── process_text.py 
│   ├── requirements.txt 
│   ├── response.py 
│   └── tests 
│    ├── __init__.py 
│    ├── analyze_text_test.py 
│    ├── test_process_text.py 
│    └── unit_tests.py 
└── setup.py # no idea what's going on with this 

Tout ce que je veux faire est, il suffit d'utiliser

from analyze_text import AnalyzeText 

dans le fichier de analyze_text_test.py sans voir

« vous êtes un idiot et vous ne savez pas ce que vous faites » dans le terminal .. aka:

ImportError: No module named (whatever) 

Je trouve cette solution:

https://stackoverflow.com/a/11158224/2738183

import os,sys,inspect 
currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))) 
parentdir = os.path.dirname(currentdir) 
sys.path.insert(0,parentdir) 

import mymodule 

Ce qui fonctionne, mais il est Janky.

Pourquoi?

.. Parce que

Je l'utilise d'une manière Janky. Je ne veux pas devoir recoller ce code à chacune de mes unittests dans le dossier de tests (qui sont dans des fichiers différents.)

(Donc, si je le colle une fois dans init .py «Vous obtenez une erreur, mais j'ai essayé au hasard de voir ce qui s'est passé)

Alors, quelle est la manière la plus élégante d'aborder ce problème? (Sans repasting code (ou tout simplement le coller dans une fonction et de l'appeler plusieurs fois))

Edit: Les commentaires ont jusqu'à présent rien résolu, donc je vais essayer de faire un peu plus clair . J'ai trouvé une solution qui fonctionne. Donc, dans chaque fichier dans le répertoire de tests, je dois recoller cette solution (ou appeler la même fonction autant de fois qu'il y a de fichiers.) C'est exactement ce que j'essaie d'éviter. Je voudrais une solution qui puisse s'appliquer à tous les fichiers du répertoire de test afin que je puisse utiliser les importations du répertoire parent comme d'habitude, au lieu d'ajouter le chemin parent dans chacun de ces fichiers.

+0

Est-ce que 'from ..analyze_text import AnalyzeText' fonctionne? –

+0

Je vais modifier pour inclure cette information. Je pensais que je l'ai déclaré. –

+0

Quelle erreur obtenez-vous si vous mettez les lignes 'sys.path.insert' dans votre __init__.py?devrait fonctionner aussi loin que je sais –

Répondre

0

Peu importe. J'ai trouvé une solution élégante sur le débordement de pile que j'aime.

qui était de placer

import os,sys,inspect 
currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))) 
parentdir = os.path.dirname(currentdir) 
sys.path.insert(0,parentdir) 

dans un fichier dans le répertoire tests nommé env.py

et en ajoutant simplement

import env 

avant d'importer comme d'habitude

voir :https://stackoverflow.com/a/23386287/2738183