Importer un fichier à partir d'un sous-répertoire?
J'ai un fichier appelé tester.py
, situé sur /project
.
/project
a un sous-répertoire appelé lib
, avec un fichier appelé BoxTime.py
:
/project/tester.py
/project/lib/BoxTime.py
Je veux importer BoxTime
de tester
. J'ai essayé ceci:
import lib.BoxTime
Qui a abouti:
Traceback (most recent call last):
File "./tester.py", line 3, in <module>
import lib.BoxTime
ImportError: No module named lib.BoxTime
Des idées comment faire pour importer BoxTime
depuis le sous-répertoire?
MODIFIER
La __init__.py
était le problème, mais n'oubliez pas de consulter BoxTime
comme lib.BoxTime
, ou de l'utilisation:
import lib.BoxTime as BT
...
BT.bt_function()
Vous devez vous connecter pour publier un commentaire.
Prendre un regard sur les Paquets de documentation (Section 6.4) ici: http://docs.python.org/tutorial/modules.html
En bref, vous avez besoin de mettre un fichier vide nommé
dans la "lib".
__init__
fichiers (mais si vous le voulez, il suffit de s'inscrire à une auto-chargement de crochet ! C'est la différence entre hacky et piratable).lib
.lib\__init__.py
.Dans
lib\BoxTime.py
, écrire une fonctionfoo()
comme ceci:Dans votre code client dans le répertoire ci-dessus
lib
, écrire:Exécuter votre code client. Vous obtiendrez:
Bien plus tard, dans linux, il devrait ressembler à ceci:
Vous pouvez essayer de l'insérer dans
sys.path
:cd /data
,python ../project/tester.py
. Ensuite, il ne fonctionnera pas.__init__.py
dans le module de dossiers.Votre répertoire lib contient un
__init__.py
fichier?Python utilise
__init__.py
pour déterminer si un répertoire est un module.J'écris cela parce que tout le monde semble suggérer que vous devez créer un
lib
répertoire.Vous n'avez pas besoin de nom de votre sous-répertoire
lib
. Vous pouvez lui donner un nomanything
à condition de mettre un__init__.py
en elle.Vous pouvez le faire en entrant la commande suivante dans un shell linux:
Alors maintenant, vous avez cette structure:
Vous pouvez ensuite importer
mylib
enmain.py
comme ceci:Vous pouvez également importer des fonctions et des classes comme ceci:
Toute variable de classe ou de fonction à l'intérieur
__init__.py
peut également être consulté:Ou comme ceci:
utils\__init__.py
etutils\myfile.py
. (Utils contient les deux fichiers) C'est la façon dont je suis en train d'importerfrom utils.myfile import myMethod
. Mais j'aiModuleNotFoundError: No module named 'utils'
. Quel peut être le problème? P. S: je suis en utilisantDjango
et j'essaie de l'importer dansviews.py
qui est au même niveau queutils
dossierEssayer
import .lib.BoxTime
. Pour plus d'informations lisez à propos relatif à l'importation dans PEP 328.Je ne ce qui, fondamentalement, couvre tous les cas (assurez-vous que vous avez
__init__.py
relative/chemin/vers/votre/lib/dossier):Exemple:
Vous avez dans votre dossier de projet:
Vous avez dans un autre dossier de projet:
Vous souhaitez utiliser
/root/anotherproject/utils.py
et appeler foo fonction qui est en elle.De sorte que vous écrivez dans app.py:
os.path
vous voudrez probablement utiliseros.path.join((os.path.dirname(os.path.realpath(__file__)),'..','anotherproject')
au lieu de coder en dur le '/' dans votre chemin de concaténation."../anotherproject"
sansos.path.dirname()
?dirname(realpath(__file__))
, puis il va calculer le chemin relatif au répertoire de travail courant lorsque vous exécutez le script, pas par rapport à l'endroit où le script vie.Créer un fichier vide
__init__.py
dans le sous-répertoire /lib.Et d'ajouter en début de code principal
puis
ou mieux
essayez ceci:
from lib import BoxTime
/project/tester.py
/project/lib/BoxTime.py
créer fichier vide
__init__.py
en bas de la ligne jusqu'à ce que vous atteindre le fichier/project/lib/somefolder/BoxTime.py
#lib
-- besoins a deux éléments que l'on__init__.py
et un répertoire nommé mondossier#somefolder
a deux élémentsboxtime.py
et__init__.py