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
à partir de tester
. J'ai essayé ceci:
import lib.BoxTime
Qui en a résulté:
Traceback (most recent call last):
File "./tester.py", line 3, in <module>
import lib.BoxTime
ImportError: No module named lib.BoxTime
Des idées pour importer BoxTime
depuis le sous-répertoire?
Modifier
Le __init__.py
était le problème, mais n'oubliez pas de consulter BoxTime
, comme lib.BoxTime
, ou d'utiliser:
import lib.BoxTime as BT
...
BT.bt_function()
10 réponses
Jetez un oeil à la documentation des paquets (Section 6.4) ici: http://docs.python.org/tutorial/modules.html
En bref, vous devez mettre un fichier vide nommé
__init__.py
Dans le répertoire "lib".
- créez un sous-répertoire nommé
lib
. - créez un fichier vide nommé
lib\__init__.py
. -
Dans
lib\BoxTime.py
, écrire une fonctionfoo()
comme ceci:def foo(): print "foo!"
-
Dans votre code client dans le répertoire ci-dessus
lib
, écrire:from lib import BoxTime BoxTime.foo()
-
Exécutez votre code client. Vous obtiendrez:
foo!
Beaucoup plus tard - sous linux, cela ressemblerait à ceci:
% cd ~/tmp
% mkdir lib
% touch lib/__init__.py
% cat > lib/BoxTime.py << EOF
heredoc> def foo():
heredoc> print "foo!"
heredoc> EOF
% tree lib
lib
├── BoxTime.py
└── __init__.py
0 directories, 2 files
% python
Python 2.7.6 (default, Mar 22 2014, 22:59:56)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from lib import BoxTime
>>> BoxTime.foo()
foo!
Vous pouvez essayer de l'insérer dans sys.path
:
sys.path.insert(0, './lib')
import BoxTime
Votre répertoire lib contient-il un fichier __init__.py
?
Python utilise __init__.py
pour déterminer si un répertoire est un module.
Je ne ce qui, fondamentalement, couvre tous les cas (assurez-vous que vous avez __init__.py
relative/chemin/vers/votre/lib/dossier):
import sys, os
sys.path.append(os.path.dirname(os.path.realpath(__file__)) + "/relative/path/to/your/lib/folder")
import someFileNameWhichIsInTheFolder
...
somefile.foo()
Exemple:
Vous avez dans votre dossier de projet:
/root/myproject/app.py
, Vous avez dans un autre dossier de projet:
/root/anotherproject/utils.py
/root/anotherproject/__init__.py
Vous voulez utiliser /root/anotherproject/utils.py
et appeler la fonction foo qui s'y trouve.
Donc vous écrivez app.py:
import sys, os
sys.path.append(os.path.dirname(os.path.realpath(__file__)) + "/../anotherproject")
import utils
utils.foo()
Créez un fichier vide __init__.py
dans le sous-répertoire / lib.
Et ajouter au début du code principal
from __future__ import absolute_import
Puis
import lib.BoxTime as BT
...
BT.bt_function()
Ou mieux
from lib.BoxTime import bt_function
...
bt_function()
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 nommer votre sous-répertoire lib
. Vous pouvez le nommer anything
à condition d'y mettre un __init__.py
.
, Vous pouvez le faire en entrant la commande suivante dans un shell linux:
$ touch anything/__init__.py
Alors maintenant, vous avez cette structure:
$ ls anything/
__init__.py
mylib.py
$ ls
main.py
Ensuite, vous pouvez importer mylib
dans main.py
comme ceci:
from anything import mylib
Et vous pouvez utiliser vos fonctions comme ce:
mylib.myfun()
/project/tester.py
/project/lib/BoxTime.py
Créez un fichier vide __init__.py
sur la ligne jusqu'à ce que vous atteigniez le fichier
/project/lib/somefolder/BoxTime.py
#lib
-- besoins a deux éléments __init__.py
et un répertoire nommé mondossier
#somefolder
a deux éléments boxtime.py
et __init__.py