es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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')
Tags:  ,

Answer

  1. Avatar for 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 utilizando os.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:

    import os
    import subprocess
    
    requirements = ['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())
    
    subprocess.run(['source', './bin/activate'], shell=True)
    
    for req in requirements:
        subprocess.run(['pip', 'install', req], check=True)
    
    print('\n\n***FINISHED***')
    

    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 comando pip ahora se ejecuta utilizando subprocess.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 utilizar os.system() y correr el riesgo de fallos o ataques de inyección.

Comments are closed.