web-dev-qa-db-fra.com

Importer un fichier depuis un sous-répertoire?

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()
397
Adam Matan

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".

484
Greg
  • Créez un sous-répertoire nommé lib.
  • Créez un fichier vide nommé 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!
144
hughdbrown

Vous pouvez essayer de l'insérer dans sys.path:

sys.path.insert(0, './lib')
import BoxTime
56
Kresimir

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)
20
nurettin

Votre répertoire lib contient-il un fichier __init__.py?

Python utilise __init__.py pour déterminer si un répertoire est un module.

19
Wade

Essayez import .lib.BoxTime. Pour plus d'informations, lisez à propos de l'importation relative dans PEP 328 .

15
drrlvn

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()
7
Mercury

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()
3
Mik

essaye ça:

from lib import BoxTime

0
Orane