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()
¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top