¿Importar un archivo desde un subdirectorio?
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 tester
. He probado 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
Ese __init__.py
era el problema, pero no olvides referirte BoxTime
como lib.BoxTime
, o usar:
import lib.BoxTime as BT
...
BT.bt_function()
Eche un vistazo a la documentación de Paquetes (Sección 6.4) .
En resumen, debe colocar un archivo en blanco llamado
__init__.py
en el lib
directorio.
- Cree 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 anterior
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!
Puedes intentar insertarlo en sys.path
:
sys.path.insert(0, './lib')
import BoxTime
Estoy escribiendo esto porque todo el mundo parece sugerir que hay que crear un lib
directorio.
No es necesario que le pongas un nombre a tu subdirectorio lib
. Puedes nombrarlo anything
siempre que le pongas un __init__.py
.
Puede hacerlo ingresando el siguiente comando en un shell de Linux:
$ touch anything/__init__.py
Entonces ahora tienes esta estructura:
$ ls anything/
__init__.py
mylib.py
$ ls
main.py
Luego puedes importar mylib
de main.py
esta manera:
from anything import mylib
mylib.myfun()
También puedes importar funciones y clases como esta:
from anything.mylib import MyClass
from anything.mylib import myfun
instance = MyClass()
result = myfun()
__init__.py
También se puede acceder a cualquier función o clase variable que coloque dentro :
import anything
print(anything.myvar)
O así:
from anything import myvar
print(myvar)
Intentar import .lib.BoxTime
. Para más información lea sobre importación relativa en PEP 328 .