2017-10-02 5 views
0
├── ledger 
│   ├── __init__.py 
│   ├── ledger_data.py 
│   └── ledger_model.py 
├── main.py 
├── sscommon 
│   ├── __init__.py 
│   └── logging.py 
└── tests 
    └── test_ledger_data.py 

Je veux importer des classes à partir ledger_data modules lors de l'exécution test_ledger_data.py. Je fais actuellement sys.path.append("../") dans test_ledger_data.py ou je dois ajouter des liens symbolik à tous les modules étant utilisés pour le répertoire tests. Les deux options semblent incorrectes. Comment le faire correctement?Importer des modules de projet python des tests sous-répertoire

Si je viens de lancer le fichier soit à partir de la racine du projet ou tests répertoires J'obtiens l'erreur:

from ledger.ledger_data import LedgerData 
ImportError: No module named 'ledger' 
+1

créer un fichier '__init __. Py' dans le dossier' tests/'et y mettre vos entrées – Vinny

Répondre

1

Vous pouvez créer un fichier __init__.py dans votre dossier, et importer le répertoire parent à l'aide:

parent_dir = os.path.abspath(os.path.join(os.path.abspath(__file__), os.pardir)) 
sys.append(parent_dir) 

Ceci utilise os.path pour trouver le répertoire en fonction de l'emplacement de votre fichier.


Mise à jour: créer le __init__.py ci-dessus et résident à l'intérieur dossier tests/. Ensuite, dans votre test_ledge_data.py mis en tête du fichier from __init__ import *; cela importera tout dans votre fichier init vers l'espace de noms de votre module.

+0

Veuillez clarifier comment voulez-vous utiliser les tests? Si je cours directement (comme dans la question d'origine) 'python3 test_ledger_data.py' votre code n'est pas importé/exécuté. Si je cours à partir d'un nouveau fichier python résidant dans le répertoire racine, cela fonctionne même sans ce code. – VladimirLenin

+0

Est-ce quelque chose de mieux que 'sys.path.append (" ../ ")'? J'ai lu ici sur SO que ce n'est pas une bonne pratique. N'aura-t-il pas des effets secondaires en faisant 'from tests.test_ledger_data import TestLedgerData', si finalement je décide de lancer à partir d'un autre emplacement? – VladimirLenin

+0

@VladimirLenin Le code ci-dessus importe le dossier parent; Tant que la structure est conservée même si vous la déplacez vers un autre emplacement, cela fonctionnera. Si vous avez trouvé ma réponse utile, merci d'envisager de l'upvoter et de l'accepter, merci – Vinny