gestion - importar clases en python
Importar un archivo desde un subdirectorio? (10)
Tengo un archivo llamado tester.py
, ubicado en /project
.
/project
tiene un subdirectorio llamado lib
, con un archivo llamado BoxTime.py
:
/project/tester.py
/project/lib/BoxTime.py
Quiero importar BoxTime
desde el tester
. He intentado esto:
import lib.BoxTime
Cual resulto:
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
desde el subdirectorio?
EDITAR
El __init__.py
era el problema, pero no olvide referirse a BoxTime
como lib.BoxTime
, o use:
import lib.BoxTime as BT
...
BT.bt_function()
¿Su directorio lib contiene un archivo __init__.py
?
Python usa __init__.py
para determinar si un directorio es un módulo.
Cree un archivo vacío __init__.py
en el subdirectorio / lib. Y añadir al principio 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()
Eche un vistazo a la documentación de Paquetes (Sección 6.4) aquí: http://docs.python.org/tutorial/modules.html
En resumen, necesitas poner un archivo en blanco llamado
__init__.py
en el directorio "lib".
Estoy escribiendo esto porque todos parecen sugerir que tienes que crear un directorio lib
.
No necesita nombrar su subdirectorio lib
. Puede ponerle el nombre que desee, siempre que ponga un __init__.py
en él.
Puede hacerlo ingresando el siguiente comando en un shell de Linux:
$ touch anything/__init__.py
Así que ahora tienes esta estructura:
$ ls anything/
__init__.py
mylib.py
$ ls
main.py
Entonces puedes importar mylib
en main.py
esta manera:
from anything import mylib
Y puedes usar tus funciones así:
mylib.myfun()
Hago esto que básicamente cubre todos los casos (asegúrate de que tienes __init__.py
en la __init__.py
relativa / ruta / a / tu / lib /):
import sys, os
sys.path.append(os.path.dirname(os.path.realpath(__file__)) + "/relative/path/to/your/lib/folder")
import someFileNameWhichIsInTheFolder
...
somefile.foo()
Ejemplo:
Tienes en tu carpeta de proyectos:
/root/myproject/app.py
Tienes en otra carpeta de proyecto:
/root/anotherproject/utils.py
/root/anotherproject/__init__.py
Desea utilizar /root/anotherproject/utils.py
y llamar a la función foo que está en ella.
Así que escribes en app.py:
import sys, os
sys.path.append(os.path.dirname(os.path.realpath(__file__)) + "/../anotherproject")
import utils
utils.foo()
Intente import .lib.BoxTime
. Para obtener más información, lea acerca de la importación relativa en PEP 328 .
Puedes intentar insertarlo en sys.path
:
sys.path.insert(0, ''./lib'')
import BoxTime
prueba esto:
from lib import BoxTime
/project/tester.py
/project/lib/BoxTime.py
cree un archivo en blanco __init__.py
en la línea hasta que llegue al archivo
/project/lib/somefolder/BoxTime.py
#lib
- needs tiene dos elementos, uno __init__.py
y un directorio llamado somefolder #somefolder
tiene dos elementos boxtime.py
y __init__.py
- Crea un subdirectorio llamado
lib
. - Cree un archivo vacío llamado
lib/__init__.py
. En
lib/BoxTime.py
, escribe una funciónfoo()
como esta:def foo(): print "foo!"
En su código de cliente en el directorio que se encuentra arriba de
lib
, escriba:from lib import BoxTime BoxTime.foo()
Ejecute su código de cliente. Conseguirás:
foo!
Mucho más tarde - en linux, 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!