python importare - Importa un file da una sottodirectory?




in corrente (9)

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

Answers

/project/tester.py

/project/lib/BoxTime.py

crea il file vuoto __init__.py lungo la linea fino a raggiungere il file

/project/lib/somefolder/BoxTime.py

#lib - needs ha due elementi uno __init__.py e una directory denominata somefolder #somefolder ha due elementi boxtime.py e __init__.py


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

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


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

La tua directory lib contiene un file __init__.py ?

Python usa __init__.py per determinare se una directory è un modulo.


Puoi provare a inserirlo in sys.path :

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

prova questo:

from lib import BoxTime


Usare i generatori

import os
def get_files(search_path):
     for (dirpath, _, filenames) in os.walk(search_path):
         for filename in filenames:
             yield os.path.join(dirpath, filename)
list_files = get_files('.')
for filename in list_files:
    print(filename)




python module subdirectory python-import