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()
321
demandé sur martineau 2009-08-11 18:39:05

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

409
répondu Greg 2009-08-11 14:46:29
  • créez un sous-répertoire nommé lib.
  • créez un fichier vide nommé lib\__init__.py.
  • Dans lib\BoxTime.py, écrire une fonction foo() 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!
124
répondu hughdbrown 2017-12-22 12:01:28

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

sys.path.insert(0, './lib')
import BoxTime
40
répondu Kresimir 2013-02-21 09:47:42

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
répondu Wade 2009-08-11 14:44:44

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

12
répondu drrlvn 2009-08-11 14:48:53

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()
6
répondu Mercury 2017-03-05 12:56:26

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()
3
répondu Mik 2018-01-28 20:58:28

Essayez ceci:

from lib import BoxTime

0
répondu Orane 2015-09-28 20:53:28

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()
0
répondu nurettin 2018-10-03 14:11:35

/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

-1
répondu Chaitanya Gk 2018-03-17 07:40:10