python - struttura - Importa un file da una sottodirectory?




struttura progetto python (7)

Crea un file vuoto __init__.py nella sottodirectory / lib. E aggiungi all'inizio del codice principale

from __future__ import absolute_import 

poi

import lib.BoxTime as BT
...
BT.bt_function()

o meglio

from lib.BoxTime import bt_function
...
bt_function()

Ho un file chiamato tester.py , che si trova su /project .

/project ha una sottodirectory chiamata lib , con un file chiamato BoxTime.py :

/project/tester.py
/project/lib/BoxTime.py

Voglio importare BoxTime dal tester . Ho provato questo:

import lib.BoxTime

Quale risultato:

Traceback (most recent call last):
  File "./tester.py", line 3, in <module>
    import lib.BoxTime
ImportError: No module named lib.BoxTime

Qualche idea su come importare BoxTime dalla sottodirectory?

MODIFICARE

Il __init__.py era il problema, ma non dimenticare di riferirti a BoxTime come lib.BoxTime , o usare:

import lib.BoxTime as BT
...
BT.bt_function()


Lo faccio che sostanzialmente copre tutti i casi (assicurati di avere __init__.py in relativo / percorso / alla / tua / lib / cartella):

import sys, os
sys.path.append(os.path.dirname(os.path.realpath(__file__)) + "/relative/path/to/your/lib/folder")
import someFileNameWhichIsInTheFolder
...
somefile.foo()


Esempio:
Hai nella cartella del tuo progetto:

/root/myproject/app.py

Hai in un'altra cartella di progetto:

/root/anotherproject/utils.py
/root/anotherproject/__init__.py

Si desidera utilizzare /root/anotherproject/utils.py e chiamare la funzione foo che è in essa.

Quindi scrivi in ​​app.py:

import sys, os
sys.path.append(os.path.dirname(os.path.realpath(__file__)) + "/../anotherproject")
import utils

utils.foo()

Prova a import .lib.BoxTime . Per maggiori informazioni leggere sull'importazione relativa in PEP 328 .


Sto scrivendo questo perché tutti sembrano suggerire che devi creare una directory lib .

Non hai bisogno di nominare la tua sottodirectory lib . Puoi nominarlo anything purché tu inserisca un __init__.py .

Puoi farlo inserendo il seguente comando in una shell di linux:

$ touch anything/__init__.py 

Quindi ora hai questa struttura:

$ ls anything/
__init__.py
mylib.py

$ ls
main.py

Quindi puoi importare mylib in main.py in questo modo:

from anything import mylib 

E puoi usare le tue funzioni in questo modo:

mylib.myfun()

prova questo:

from lib import BoxTime


  • Creare una sottodirectory di nome lib .
  • Creare un file vuoto denominato lib\__init__.py .
  • In lib\BoxTime.py , scrivi una funzione foo() come questa:

    def foo():
        print "foo!"
    
  • Nel tuo codice cliente nella directory sopra lib , scrivi:

    from lib import BoxTime
    BoxTime.foo()
    
  • Esegui il tuo codice cliente. Otterrete:

    foo!
    

Molto più tardi - in Linux, sarebbe simile a questo:

% 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!




python-import