L'exécution de sous-processus au sein des différentes virtualenv avec python
Disons que j'ai 2 versions différentes de mon app installé dans 2 différents virtualenvironments. myapp v1.0 et myapp v2.0.
Maintenant, je voudrais comparer ceux-ci. La comparaison est écrit en python lui-même. Quelle serait la meilleure façon de le faire? Supposons que je puisse exécuter séparément et écrire un fichier de sortie, donc je peux comparer plus tard.
Une façon de le faire serait d'écrire un script bash (c'est ce que j'ai actuellement). - Je activer un virtualenv, exécuter myapp v1.0, activez un autre virtualenv, exécuter myapp v2.0. Plus tard, un module de comparaison sur ces fichiers. Mais je voudrais ajouter un peu plus dynamique, il (prendre quelques arguments facultatifs etc) qui serait plus facile avec python.
Edit:
Actuellement, j'ai quelque chose comme ça (un script bash):
source virtualenv1/bin/activate
python my_script.py
deactivate
source virtualenv2/bin/activate
python my_other_script.py
deactivate
python my_comparison_script.py
au lieu de cela, je voudrais faire seulement:
python my_comparison_script.py
et mes scripts être exécuté à l'intérieur de ce.
Vous devez vous connecter pour publier un commentaire.
quelle est exactement la question? comment utiliser les sous-processus pour exécuter des commandes shell? si c'est le cas, certains simpliste pseudo code pourrait ressembler à:
puis vous pouvez faire ce que vous voulez avec standard (
outStream
) et de faire des choses différentes sierrStream
existe (erreur standard). cela comprend la rédaction de la norme ou d'erreur standard vers un fichier. puis-je suppose que vous diff de ces fichiers?un réel exemple de code (en supposant que vous avez la version 2.6 de python+ sur un système linux) pourrait ressembler à:
. /venv1/bin/activate && python your_app.py
et de l'exécuter à l'aide deshell = TRUE
pour exécuteryour_app.py
à l'aide devenv1
dans un sous-processus.Accepté la réponse ne traite pas le problème de "l'activation" un virtualenv dans un sous-processus.
Si vous démarrez votre application avec un appel à l'exécutable python, comme dans votre exemple, il est en fait très simple: il vous suffit de spécifier le fichier exécutable dans le virtualenv.
va commencer le processus dans les virtualenvs.
Important
Pour répondre aux préoccupations exprimées dans les commentaires:
Si vous souhaitez exécuter un sous-processus et assurez-vous d'utiliser l'interprète que le processus actuel est en cours d'exécution en vous devez utiliser sys.exécutable. Aussi disponible: sys.exec_prefix pour accéder au répertoire spécifique au site préfixe où la plate-forme dépendant de fichiers Python sont installés.
Si vous voulez un beaucoup plus en profondeur de la discussion de ce sujet, jetez un oeil à ce pull request.
PYTHONHOME
est définie et quand la cible programme utilisecommand
ouPopen
pour exécuter un autre programme en Python. Ce dernier s'sans doute glauque.D'une option simple serait d'exécuter une série de commandes avec sous-processus comme suit.
Et répéter au besoin.
Je pense que virtualenv documentation explique bien.
TL;DR
Running python venv binaire directement est PAS le même que l'activation de venv.
Vous devez également modifier CHEMIN et VIRTUAL_ENV variables en conséquence (voir os.environ)
Source