¿Importar un archivo desde un subdirectorio?

Resuelto Adam Matan asked hace 15 años • 13 respuestas

Tengo un archivo llamado tester.py, ubicado en /project.

/projecttiene un subdirectorio llamado lib, con un archivo llamado BoxTime.py:

/project/tester.py
/project/lib/BoxTime.py

Quiero importar BoxTimedesde 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 BoxTimedesde el subdirectorio?

EDITAR

Ese __init__.pyera el problema, pero no olvides referirte BoxTimecomo lib.BoxTime, o usar:

import lib.BoxTime as BT
...
BT.bt_function()
Adam Matan avatar Aug 11 '09 21:08 Adam Matan
Aceptado

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 libdirectorio.

Greg avatar Aug 11 '2009 14:08 Greg
  • Cree un subdirectorio llamado lib.
  • Cree un archivo vacío llamado lib\__init__.py.
  • En lib\BoxTime.py, escribe una función foo()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!
hughdbrown avatar Aug 11 '2009 14:08 hughdbrown

Puedes intentar insertarlo en sys.path:

sys.path.insert(0, './lib')
import BoxTime
Kresimir avatar Feb 21 '2013 09:02 Kresimir

Estoy escribiendo esto porque todo el mundo parece sugerir que hay que crear un libdirectorio.

No es necesario que le pongas un nombre a tu subdirectorio lib. Puedes nombrarlo anythingsiempre 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 mylibde main.pyesta 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__.pyTambié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)
nurettin avatar Oct 03 '2018 14:10 nurettin

Intentar import .lib.BoxTime. Para más información lea sobre importación relativa en PEP 328 .

drrlvn avatar Aug 11 '2009 14:08 drrlvn