Publiqué una respuesta similar también a la pregunta sobre las importaciones de paquetes hermanos. Puedes verlo aquí .
Solución sin sys.pathhacks
Resumen
- Envuelva el código en una carpeta (por ejemplo
packaged_stuff)
- Use crear
setup.pyscript 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.pya la carpeta raíz
El contenido del setup.pypuede ser simplemente
from setuptools import setup, find_packages
setup(name='myproject', version='1.0', packages=find_packages())
Básicamente "cualquiera" setup.pyfuncionarí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 myprojectusando pip. El truco es usar la -ebandera 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 mainfoldera cada importación
En este ejemplo, el mainfolderserí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!