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 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 BoxTimedesde el subdirectorio?
EDITAR
El __init__.pyera el problema, pero no se olvide de hacer referencia a BoxTimeque lib.BoxTime, o usar:
import lib.BoxTime as BT
...
BT.bt_function()
python
module
subdirectory
python-import
Adam Matan
fuente
fuente

__init__archivos codificados estúpidos (pero si lo desea, ¡simplemente registre un enlace de carga automática! Esta es la diferencia entre hacky y hackable ).import sys, os; sys.path.insert(0, os.path.abspath('..')); from sibling_package.hacks import HackyHackHacklib.lib\__init__.py.En
lib\BoxTime.py, escribe una funciónfoo()como esta:En su código de cliente en el directorio anterior
lib, escriba:Ejecute su código de cliente. Conseguirás:
Mucho más tarde, en Linux, se vería así:
fuente
libPuedes intentar insertarlo en
sys.path:fuente
cd /data,python ../project/tester.py. Entonces no funcionará.Estoy escribiendo esto porque todos parecen sugerir que tienes que crear un
libdirectorio.No necesita nombrar su subdirectorio
lib. Puedes nombrarloanythingsiempre y cuando lo pongas__init__.py.Puede hacerlo ingresando el siguiente comando en un shell de Linux:
Entonces ahora tienes esta estructura:
A continuación, puede importar
mylibenmain.pyeste aspecto:También puede importar funciones y clases como esta:
__init__.pyTambién se puede acceder a cualquier función o clase variable que coloque dentro :O así:
fuente
utils\__init__.pyyutils\myfile.py. (Las utilidades contienen ambos archivos) Así es como estoy tratando de importarfrom utils.myfile import myMethod. Pero lo entiendoModuleNotFoundError: No module named 'utils'. ¿Qué podría estar mal? PD: Estoy usandoDjangoe intentando importar en elviews.pyque está en el mismo nivel que lautilscarpetaPYTHONPATH=. python path/to/program.py¿Su directorio lib contiene un
__init__.pyarchivo?Python usa
__init__.pypara determinar si un directorio es un módulo.fuente
Tratar
import .lib.BoxTime. Para obtener más información, lea sobre la importación relativa en PEP 328 .fuente
Hago esto que básicamente cubre todos los casos (asegúrese de tener
__init__.pyen la carpeta relativa / ruta / a / su / lib /):Ejemplo:
tiene en su carpeta de proyecto:
Tienes en otra carpeta de proyecto:
Desea usar
/root/anotherproject/utils.pyy llamar a la función foo que está en ella.Entonces escribes en app.py:
fuente
os.path, probablemente quiera usar enos.path.join((os.path.dirname(os.path.realpath(__file__)),'..','anotherproject')lugar de codificar '/' en la concatenación de ruta."../anotherproject"prescindir delos.path.dirname()?dirname(realpath(__file__)), entonces calculará la ruta relativa a su directorio de trabajo actual cuando ejecute el script, no en relación con el lugar donde vive el script.Cree un archivo vacío
__init__.pyen el subdirectorio / lib. Y agregue al comienzo del código principalentonces
o mejor
fuente
Solo una adición a estas respuestas.
Si desea importar todos los archivos de todos los subdirectorios , puede agregar esto a la raíz de su archivo.
Y luego simplemente puede importar archivos de los subdirectorios como si estos archivos estuvieran dentro del directorio actual.
Ejemplo de trabajo
Si tengo el siguiente directorio con subdirectorios en mi proyecto ...
Puedo poner el siguiente código dentro de mi
a.pyarchivoEn otras palabras, este código extraerá de qué directorio proviene el archivo.
fuente
/project/tester.py/project/lib/BoxTime.pycree un archivo en blanco
__init__.pyen la línea hasta llegar al archivo/project/lib/somefolder/BoxTime.py#lib- necesidades tiene dos elementos uno__init__.pyy un directorio llamado somefolder#somefoldertiene dos elementosboxtime.pyy__init__.pyfuente
prueba esto:
from lib import BoxTimefuente