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 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 se olvide de hacer referencia a BoxTime
que 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 HackyHackHack
lib
.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
lib
Puedes 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
lib
directorio.No necesita nombrar su subdirectorio
lib
. Puedes nombrarloanything
siempre 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
mylib
enmain.py
este aspecto:También puede importar funciones y clases como esta:
__init__.py
También se puede acceder a cualquier función o clase variable que coloque dentro :O así:
fuente
utils\__init__.py
yutils\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 usandoDjango
e intentando importar en elviews.py
que está en el mismo nivel que lautils
carpetaPYTHONPATH=. python path/to/program.py
¿Su directorio lib contiene un
__init__.py
archivo?Python usa
__init__.py
para 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__.py
en 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.py
y 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__.py
en 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.py
archivoEn otras palabras, este código extraerá de qué directorio proviene el archivo.
fuente
/project/tester.py
/project/lib/BoxTime.py
cree un archivo en blanco
__init__.py
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 elementosboxtime.py
y__init__.py
fuente
prueba esto:
from lib import BoxTime
fuente