Publiqué una respuesta similar también a la pregunta sobre las importaciones de paquetes hermanos. Puedes verlo aquí .
Solución sin sys.path
hacks
Resumen
- Envuelva el código en una carpeta (por ejemplo
packaged_stuff
)
- Use crear
setup.py
script donde use setuptools.setup () .
- Pip instala el paquete en estado editable con
pip install -e <myproject_folder>
- Importar usando
from packaged_stuff.modulename import function_name
Preparar
Asumo la misma estructura de carpetas que en la pregunta
.
└── ptdraft
├── __init__.py
├── nib.py
└── simulations
├── __init__.py
└── life
├── __init__.py
└── life.py
Llamo a la .
carpeta raíz, y en mi caso se encuentra en C:\tmp\test_imports
.
Pasos
1) Agregue a setup.py
a la carpeta raíz
El contenido del setup.py
puede ser simplemente
from setuptools import setup, find_packages
setup(name='myproject', version='1.0', packages=find_packages())
Básicamente "cualquiera" setup.py
funcionaría. Este es solo un ejemplo de trabajo mínimo.
2) Use un entorno virtual
Si está familiarizado con los entornos virtuales, active uno y salte al siguiente paso. El uso de entornos virtuales no es absolutamente obligatorio, pero realmente lo ayudarán a largo plazo (cuando tenga más de 1 proyecto en curso ...). Los pasos más básicos son (ejecutar en la carpeta raíz)
- Crea env virtual
- Activar env virtual
. /venv/bin/activate
(Linux) o ./venv/Scripts/activate
(Win)
Para obtener más información sobre esto, solo busque en Google "python virtualenv tutorial" o similar. Probablemente nunca necesite más comandos que crear, activar y desactivar.
Una vez que haya creado y activado un entorno virtual, su consola debe indicar el nombre del entorno virtual entre paréntesis
PS C:\tmp\test_imports> python -m venv venv
PS C:\tmp\test_imports> .\venv\Scripts\activate
(venv) PS C:\tmp\test_imports>
3) pip instala tu proyecto en estado editable
Instale su paquete de nivel superior myproject
usando pip
. El truco es usar la -e
bandera al hacer la instalación. De esta forma, se instala en un estado editable, y todas las ediciones realizadas en los archivos .py se incluirán automáticamente en el paquete instalado.
En el directorio raíz, ejecute
pip install -e .
(tenga en cuenta el punto, significa "directorio actual")
También puede ver que se instala utilizando pip freeze
(venv) PS C:\tmp\test_imports> pip install -e .
Obtaining file:///C:/tmp/test_imports
Installing collected packages: myproject
Running setup.py develop for myproject
Successfully installed myproject
(venv) PS C:\tmp\test_imports> pip freeze
myproject==1.0
4) Importar anteponiendo mainfolder
a cada importación
En este ejemplo, el mainfolder
sería ptdraft
. Esto tiene la ventaja de que no encontrará colisiones de nombres con otros nombres de módulos (desde la biblioteca estándar de Python o módulos de terceros).
Ejemplo de uso
nib.py
def function_from_nib():
print('I am the return value from function_from_nib!')
life.py
from ptdraft.nib import function_from_nib
if __name__ == '__main__':
function_from_nib()
Ejecutando life.py
(venv) PS C:\tmp\test_imports> python .\ptdraft\simulations\life\life.py
I am the return value from function_from_nib!