Tengo una estructura de archivo como esta:
Folder
Common
foo1.py
TestFolder
foo2.py
Quiero importar en foo2.py
y foo1.py
. Lo intenté pero no funciona en Ubuntu:
sys.path.append(os.path.abspath('../../'))
from Common import foo1.py
__init__.py
archivo en tu carpeta? así es como python crea paquetes y le permite importar módulos desde ese paquete. guide.python-distribute.org/creation.htmlRespuestas:
Cómo Python encuentra sus módulos
Estrictamente tomado, un módulo es un solo archivo de Python, mientras que un paquete es una carpeta que contiene archivos de Python, acompañado de un archivo (puede estar vacío) llamado
__init__.py
, para decirle a Python que es un paquete desde el cual importar módulos. En ambos casos, los módulos necesitan su.py
extensión, pero la importación se realiza sin (ver más abajo).Por defecto, Python busca sus módulos y paquetes en
$PYTHONPATH
.Para averiguar qué se incluye en $ PYTHONPATH, ejecute el siguiente código en python (3):
Cómo agregar un directorio
De vez en cuando
Desde un archivo de Python, puede agregar rutas de acceso ocasionalmente a la ruta predeterminada agregando las siguientes líneas en la sección de encabezado de su aplicación o script de Python:
Por ejemplo:
si tengo una carpeta:
/home/myname/pythonfiles
y quiero importar el archivomodule_1.py
, ubicado en ese directorio, lo agrego a la sección de encabezado de mi código:Y simplemente puedo importar el archivo
module_1.py
:Cuando creo un paquete y quiero importar módulos desde el paquete, necesito crear una carpeta que
$PYTHONPATH
contenga los módulos, acompañada de un archivo (puede estar vacío) llamado__init__.py
Por ejemplo:
Para importar desde un paquete (carpeta) llamada
my_package
en/home/myname/pythonfiles
, añadir la/home/myname/pythonfiles
ruta a su$PYTHONPATH
, al igual que en el ejemplo 1, e importar el módulo llamadomodule_2.py
(dentro de la carpeta del paquete) simplemente con: `Agregar directorios a
$PYTHONPATH
permanentemente:Agregue la siguiente línea a su
~/.profile
archivo.Subdirectorios
Desde dentro de un paquete, los subdirectorios no se incluyen así; necesita "encadenar" los directorios. Para importar un módulo
module_3.py
, dentro de la carpetasubfolder
dentro de la carpetapackagename
:Dado el hecho de que todas las subcarpetas en el paquete incluyen su propio
__init__.py
archivo.Cuando un módulo está en el mismo directorio que el script o la aplicación
No es necesario insertar la ruta a un módulo cuando está en el mismo directorio que el script o la aplicación, se agrega automáticamente.
Ejemplo:
Si tengo una carpeta que contiene
script.py
ymodule.py
, simplemente puedo importar el módulo de la siguiente manera:fuente
printenv PYTHONPATH
no hay nada?sys.path.append("/path/to/your/package_or_module")
También agrega una ruta al valor predeterminado y es menos confuso. En comparación con losys.path.insert(0,...)
que tiene0
como primer argumento.La forma correcta de usar la importación relativa es:
Y también necesita un
__init__.py
en todas sus carpetas.fuente
Nota: esta respuesta no está actualizada para la última versión de Python 3, pero está aquí para la versión anterior. Para obtener más información, lea los comentarios y https://www.python.org/dev/peps/pep-0420/
Esencialmente, cada carpeta con código python que desea agregar al syspath necesita un archivo __init__.py. Estos archivos __init__.py pueden estar vacíos.
fuente
python -c "from pathlib import Path; Path('ns').mkdir(); Path('ns/mod.py').write_text('''print('mod.py')'''); import ns.mod; from shutil import rmtree; rmtree('ns')"
también aquí hay documentación relevante, PEP 420, que describe la adición de la semántica del paquete de espacio de nombres