0. Introducción
Para poder hacer referencia a módulos que están en otra carpeta, mirar a ver si dicha referencia está en sys.path
para ver lo que hay en el sys.path
import sys print(sys.path)
Para añadir una ruta al syspath
sys.path.append('/home/ximo/miruta')
Para ver como obtenemos las rutas del fichero hasta la raiz del disco:
from pathlib import Path for path in Path(__file__).parents: print(str(path))
Y obtenemos
/home/ximo/MyPython/prova03_ref_library/lib02 /home/ximo/MyPython/prova03_ref_library /home/ximo/MyPython /home/ximo /home /
1. Solución 1: Añadir la carpeta raiz al sys.path. Si funciona por línea de comandos.
Supongamos que la librería raiz es root y esta tiene dos hijas lib01 y lib02
Supongamos que lib01 tiene dos hijas lib01_01 y lib01_02 y cada hija tiene un fichero python
Supongamos que lib02 tiene una hija lib02_01
lib01
lib01_01
proga.py
lib01_02
progb.py
lib02
lib02_01
progc.py
desde progc.py queremos llamar a los otros progs, para ello se propone buscar la ruta de la carpeta padre del proyecto (a la carpeta prova03_ref_library) y a partir de ahí hacer los imports como lib01e.carpeta_hijo.modulo. Por ejemplo lib01.lib01_01.proga
Veamos la ruta absuluta de la carpeta que contien a progc.py
/home/ximo/MyPython/prova03_ref_library/lib02/lb02_01
Observamos que hay 2 saltos a carpetas padres para pasar de la carpeta lib02_01 a la prov03_ref_library por tanto la ruta del padre se obtiene con
Path(__file__).parents[2]
Por tanto si añadimos la expresión anterior al sys.path, ya podemos referenciar los módulos y carpetas que cuelgan de ella.
# progc.py
from pathlib import Path import sys path_root2 = Path(__file__).parents[2] sys.path.append(str(path_root2)) import lib01.lib01_01.proga as proga import lib01.lib01_02.progb as progb
# O también
#from lib01.lib01_01 import proga as proga
#from lib01.lib01_02 import progb as progb
Ahora no tenemos ningún problema para hacer estas importaciones
OJO: A veces falla si desde otro módulo importamos un módulo que importa otro. Si importamos desde la misma carpeta hay que hacer el "try-except"
# ------Imprescindible para poder importar de otras carpetas (de basicutils) import sys from pathlib import Path
# ------Metemos tres niveles desde la caprta actual (o) hasta el abuelo (2)
for i in range(3):sys.path.append(str(Path(__file__).parents[i]))
from basicutils import xmutils, xmexcel, xmpolish, xmsql, xmodoo
try: # if in the same folder then needs a try and import directly
from castillautils import xmcastilla
except Exception as error:
import xmcastilla
# ------Fin imprescindible
2. Solución 2: Definir la carpeta raiz en el launch.json. NO FUNCIONA POR LINEA DE COMANDOS
Supongamos el ejemplo anterior
El nuevo launch.json será
{// Use IntelliSense to learn about possible attributes.// Hover to view descriptions of existing attributes.// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387"version": "0.2.0","configurations": [{"name": "Python Debugger: Current File","type": "debugpy","request": "launch","program": "${file}","console": "integratedTerminal","env": {"PYTHONPATH":"${workspaceRoot}"}, // modify PYTHONPATH}]}
Y el fichero se simplificaría
import lib01.lib01_01.proga as proga import lib01.lib01_02.progb as progb
# O también
#from lib01.lib01_01 import proga as proga
#from lib01.lib01_02 import progb as progb
3. Usar entorno virtual python en la configuración
Se puede crear un entorno virtual de python de varias maneras. Una es de la forma tracicional de situarse mendiante una ventana de comandos dentro de la carpeta del proyecto y ejecutar
#Opcion 1: Crearlo en una ruta relativa
python3 -m venv my-venv
#ACTIVARLO
source my-venv/bin/activate
#ACTIVARLO en WINDOWS
my-venv\Scripts\activate.bat
#---------------SI HAY PROBLEMAS DE POR COPIAR UN PROYECTO ANTERIOR
#---------------SE RECOMIENDA TRABAJAR EN RUTAS ABSOLUTAS
python3 -m venv ~/MyPython/control-presencia/my-venv
#ACTIVARLO
source ~/MyPython/control-presencia/my-venv/bin/activate
o por contra desde vscode darle a Crtl-Shit-p y seleccionar Python: create environment
Una vez creado se puede crear una configuración (launch.json) dándole al botón triangular y dándole al vínculo "create a launch.json"
Y se copia este fichero, donde se especifica una ruta apython. Ojo en windows hay que indicar el nombre de ejecutable (${workspaceRoot}/.venv/bin/python.exe)
{// Use IntelliSense to learn about possible attributes.// Hover to view descriptions of existing attributes.// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387"version": "0.2.0","configurations": [{"name": "Python Debugger: Current File","type": "debugpy","python": "${workspaceRoot}/my-venv/bin/python", //Linux"python": "${workspaceRoot}/my-venv/Scripts/python.exe", //Windows!!!"request": "launch","program": "${file}","console": "integratedTerminal","env": {"PYTHONPATH":"${workspaceRoot}"}, // modify PYTHONPATH}]}
deactivate
Para ver que entorno actual tenemos
echo $VIRTUAL_ENV
4. Ver las librerias instaladas en un entorno virtual. "requirements.txt"
Se puede listar sin detalles, con detalles o incluso crear el requirements.txt
#Primeramente hay qie activar el entorno virtual venv/bin/activate.sh #listar sin detalles pip list #listar con detalles pip freeze #crear requirements.txt peep freeze > requirements.txt
No hay comentarios :
Publicar un comentario