J'ai un fichier appelé tester.py
, situé sur /project
.
/project
possède un sous-répertoire appelé lib
, avec un fichier nommé BoxTime.py
:
/project/tester.py
/project/lib/BoxTime.py
Je veux importer BoxTime
à partir de tester
. J'ai essayé ceci:
import lib.BoxTime
Ce qui a eu pour résultat:
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 importer BoxTime
du sous-répertoire?
EDIT
Le problème était __init__.py
, mais n'oubliez pas de faire référence à BoxTime
en tant que lib.BoxTime
, ou d'utiliser:
import lib.BoxTime as BT
...
BT.bt_function()
Jetez un coup d’œil à la documentation de Packages (Section 6.4) ici: http://docs.python.org/tutorial/modules.html
En bref, vous devez mettre un fichier vierge nommé
__init__.py
dans le répertoire "lib".
lib
.lib\__init__.py
.Dans lib\BoxTime.py
, écrivez une fonction foo()
comme ceci:
def foo():
print "foo!"
Dans votre code client dans le répertoire ci-dessus lib
, écrivez:
from lib import BoxTime
BoxTime.foo()
Exécutez votre code client. Tu auras:
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
J'écris ceci parce que tout le monde semble suggérer que vous deviez créer un répertoire lib
.
Vous n'avez pas besoin de nommer votre sous-répertoire lib
. Vous pouvez le nommer anything
à condition d'y placer 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
mylib.myfun()
Vous pouvez également importer des fonctions et des classes comme ceci:
from anything.mylib import MyClass
from anything.mylib import myfun
instance = MyClass()
result = myfun()
Toute fonction variable ou classe que vous placez dans __init__.py
est également accessible:
import anything
print(anything.myvar)
Ou comme ceci:
from anything import myvar
print(myvar)
Votre répertoire lib contient-il un fichier __init__.py
?
Python utilise __init__.py
pour déterminer si un répertoire est un module.
Essayez import .lib.BoxTime
. Pour plus d'informations, lisez à propos de l'importation relative dans PEP 328 .
Je fais ceci qui couvre essentiellement tous les cas (assurez-vous que vous avez __init__.py
dans relatif/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 dans 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
ensuite
import lib.BoxTime as BT
...
BT.bt_function()
ou mieux
from lib.BoxTime import bt_function
...
bt_function()
essaye ça:
from lib import BoxTime