libreria importar gestion clases archivos python module subdirectory python-import

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()



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ón foo() 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!