Importar un archivo de un subdirectorio?
-
12-09-2019 - |
Pregunta
Tengo un archivo llamado tester.py
, situado en /project
.
/project
tiene un subdirectorio llamado lib
, con un archivo llamado BoxTime.py
:
/project/tester.py
/project/lib/BoxTime.py
Quiero importar BoxTime
de tester
. He intentado esto:
import lib.BoxTime
Lo que dio como resultado:
Traceback (most recent call last):
File "./tester.py", line 3, in <module>
import lib.BoxTime
ImportError: No module named lib.BoxTime
¿Alguna idea de cómo importar BoxTime
del subdirectorio?
Editar
El __init__.py
era el problema, pero no se olvide para referirse a BoxTime
como lib.BoxTime
, o usar:
import lib.BoxTime as BT
...
BT.bt_function()
Solución
Tome un vistazo a la documentación Paquetes (Sección 6.4) aquí: http: //docs.python .org / tutorial / modules.html
En resumen, es necesario poner un archivo en blanco con el nombre
__init__.py
en el directorio "lib".
Otros consejos
- Crea un subdirectorio llamado
lib
. - Crea un archivo vacío llamado
lib\__init__.py
. -
En
lib\BoxTime.py
, escribir unafoo()
función como esta:def foo(): print "foo!"
-
En su código de cliente en el directorio anterior
lib
, escribir:from lib import BoxTime BoxTime.foo()
-
Ejecutar su código de cliente. Obtendrá:
foo!
Mucho más tarde - en Linux, que se vería así:
% 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!
Puede intentar insertarlo en sys.path
:
sys.path.insert(0, './lib')
import BoxTime
Estoy escribiendo esto porque todo el mundo parece sugerir que usted tiene que crear un directorio lib
.
No es necesario nombrar a su lib
subdirectorio. Puede que el nombre anything
siempre pones un __init__.py
en ella.
Puede hacerlo introduciendo el siguiente comando en una shell de Linux:
$ touch anything/__init__.py
Así que ahora tiene esta estructura:
$ ls anything/
__init__.py
mylib.py
$ ls
main.py
A continuación, puede importar mylib
en main.py
como esto:
from anything import mylib
mylib.myfun()
También puede funciones de importación y clases como esta:
from anything.mylib import MyClass
from anything.mylib import myfun
instance = MyClass()
result = myfun()
Cualquier función variable o clase se coloca en el interior __init__.py
también se puede acceder a:
import anything
print(anything.myvar)
O como esto:
from anything import myvar
print(myvar)
¿Su directorio lib contiene un archivo __init__.py
?
Python usa __init__.py
para determinar si un directorio es un módulo.
Trate import .lib.BoxTime
. Para más información leer sobre la importación relativa en PEP 328 .
Lo hago que básicamente cubre todos los casos (asegúrese de que tiene __init__.py
en relación / ruta / a / su / lib / carpeta):
import sys, os
sys.path.append(os.path.dirname(os.path.realpath(__file__)) + "/relative/path/to/your/lib/folder")
import someFileNameWhichIsInTheFolder
...
somefile.foo()
Ejemplo:
Que tiene en su carpeta de proyecto:
/root/myproject/app.py
Tiene en otra carpeta del proyecto:
/root/anotherproject/utils.py
/root/anotherproject/__init__.py
Usted desea utilizar /root/anotherproject/utils.py
y llamar a la función foo que está en ella.
Así se escribe en app.py:
import sys, os
sys.path.append(os.path.dirname(os.path.realpath(__file__)) + "/../anotherproject")
import utils
utils.foo()
Crea un archivo vacío __init__.py
en el subdirectorio / lib.
Y añadir en el inicio del código principal
from __future__ import absolute_import
entonces
import lib.BoxTime as BT
...
BT.bt_function()
o mejor
from lib.BoxTime import bt_function
...
bt_function()
intente lo siguiente:
from lib import BoxTime
/project/tester.py
/project/lib/BoxTime.py
crear __init__.py
archivo en blanco en la línea hasta llegar al archivo
/project/lib/somefolder/BoxTime.py
- #lib
necesidades tiene dos elementos uno __init__.py
y un directorio llamado SomeFolder
#somefolder
tiene dos elementos boxtime.py
y __init__.py