Importare un file da una sottodirectory?
-
12-09-2019 - |
Domanda
Ho un file chiamato tester.py
, situato sulla /project
.
/project
ha una sottodirectory chiamata lib
, con un file chiamato BoxTime.py
:
/project/tester.py
/project/lib/BoxTime.py
Voglio importare BoxTime
da tester
. Ho provato questo:
import lib.BoxTime
che ha portato:
Traceback (most recent call last):
File "./tester.py", line 3, in <module>
import lib.BoxTime
ImportError: No module named lib.BoxTime
Tutte le idee su come importare BoxTime
dalla sottodirectory?
Modifica
Il __init__.py
era il problema, ma non dimenticate di fare riferimento a BoxTime
come lib.BoxTime
, o l'uso:
import lib.BoxTime as BT
...
BT.bt_function()
Soluzione
Date un'occhiata alla documentazione di pacchetti (paragrafo 6.4) qui: http: //docs.python .org / tutorial / modules.html
In breve, è necessario mettere un file vuoto denominato
__init__.py
nella directory "lib".
Altri suggerimenti
- Creare una sottodirectory
lib
. - Crea un file vuoto di nome
lib\__init__.py
. -
In
lib\BoxTime.py
, scrivere una funzionefoo()
come questo:def foo(): print "foo!"
-
Nel codice cliente nella directory sopra
lib
, scrivere:from lib import BoxTime BoxTime.foo()
-
Eseguire il codice client. Otterrete:
foo!
Molto più tardi - in linux, sarebbe simile a questa:
% 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!
Si può provare inserendola in sys.path
:
sys.path.insert(0, './lib')
import BoxTime
sto scrivendo questo giù perché tutti sembrano suggerire che è necessario creare una directory lib
.
Non è necessario assegnare un nome al lib
sub-directory. È possibile assegnare un nome che anything
fornito si mette un __init__.py
in esso.
Si può fare inserendo il seguente comando in una shell linux:
$ touch anything/__init__.py
Così ora avete questa struttura:
$ ls anything/
__init__.py
mylib.py
$ ls
main.py
Quindi è possibile importare in mylib
main.py
in questo modo:
from anything import mylib
mylib.myfun()
Puoi anche funzioni di importazione e classi come questo:
from anything.mylib import MyClass
from anything.mylib import myfun
instance = MyClass()
result = myfun()
Ogni funzione variabile o classe che si svolge all'interno di __init__.py
si può accedere anche:
import anything
print(anything.myvar)
O come questa:
from anything import myvar
print(myvar)
La vostra directory lib contiene un file __init__.py
?
Python usa __init__.py
per determinare se una directory è un modulo.
Prova import .lib.BoxTime
. Per ulteriori informazioni leggere l'importazione relativa a PEP 328 .
Lo faccio che copre praticamente tutti i casi (assicuratevi di avere __init__.py
in relativa / path / to / file / 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:
Avete nella cartella del 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 esso.
Quindi, si scrive in app.py:
import sys, os
sys.path.append(os.path.dirname(os.path.realpath(__file__)) + "/../anotherproject")
import utils
utils.foo()
Crea un file vuoto __init__.py
nella sottodirectory / lib.
E aggiungere al 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()
provare questo:
from lib import BoxTime
/project/tester.py
/project/lib/BoxTime.py
creare il file __init__.py
vuoto lungo la linea fino a raggiungere il file
/project/lib/somefolder/BoxTime.py
#lib
- esigenze ha due elementi uno __init__.py
e una directory chiamata somefolder
#somefolder
ha due elementi boxtime.py
e __init__.py