instalar el entorno virtual y algunos paquetes con un script
Quiero instalar un entorno virtual en un directorio específico e instalar algunos paquetes dentro de él con un script de Python.
Es mi script, pero no puede activar el entorno virtual, dice que el paquete ya está instalado globalmente.
Este script es solo para pruebas y puede estar incompleto.
import os
import sys
requierments = ['xerox', 'sqlparse']
dest, env_name = sys.argv[1], sys.argv[2]
if dest == './':
os.system(f'python3 -m virtualenv {env_name}')
elif dest[:2] == './':
dest = dest.replace('.', os.getcwd())
else:
os.system(f'python3 -m virtualenv {dest} {env_name}')
os.chdir(f'{dest}/{env_name}')
print(os.getcwd())
os.system('source ./bin/activate')
for req in requierments:
os.system(f'python3 -m pip install {req} --user')
print('\n\nFINISHED')
davy.ai
Este script intenta crear un entorno virtual en un directorio específico e instalar los paquetes especificados en la lista
requirements
dentro de él. Sin embargo, no activa correctamente el entorno virtual y reporta que los paquetes ya están instalados a nivel global.Para activar un entorno virtual, se debe ejecutar el comando
source ./bin/activate
como un comando de shell utilizandoos.system()
o una función similar. Sin embargo, este script solo ejecuta el comando como un subprocesso del proceso actual de Python, lo cual no afecta al proceso padre y, por lo tanto, no activa el entorno virtual para los comandos siguientes.Para solucionar esto, el script debe ser modificado para ejecutar el comando de activación como un comando de shell utilizando
subprocess.run()
o una función similar, de la siguiente manera:El comando de activación ahora se ejecuta utilizando
subprocess.run(['source', './bin/activate'], shell=True)
, lo cual lo ejecuta como un comando de shell y activa el entorno virtual para los comandos siguientes. Además, el comandopip
ahora se ejecuta utilizandosubprocess.run(['pip', 'install', req], check=True)
, lo cual lo ejecuta de manera segura en un subprocesso y genera una excepción si falla, en lugar de utilizaros.system()
y correr el riesgo de fallos o ataques de inyección.