web-dev-qa-db-fra.com

Meilleure façon d'exécuter un script python dans un environnement conda donné

Je veux exécuter un script python executed.py d'un autre python trigger.py en utilisant le package de sous-processus. Le executed.py doit être exécuté dans un environnement conda différent de trigger.py (disons executed_env et trigger_env). Quelle est la meilleure façon de le faire ? Mon code actuel de trigger.py est:

command = "python executed.py --option1 -dir /path/to/dir"
args = shlex.split(command)
my_subprocess = subprocess.Popen(args)

Il renvoie une erreur puisque executed.py est exécuté dans le trigger_env environnement.

13
Robin

J'ai fait des recherches sur toutes les méthodes intégrées conda et trouvé les éléments suivants. Le premier est une solution de contournement, et le second la solution intégrée de la solution finale (non disponible au moment de la rédaction de cet article).

  1. conda-wrappers Guilherme Melo a créé un wrappers pour les exécutables python dans un environnement conda. Si vous le définissez comme interpréteur python dans votre IDE, par exemple PyCharm, il activera l'environnement conda à partir duquel il est appelé, puis appellera l'interpréteur python. Regardez ici dans la section "Création de wrappers conda": https://pypi.org/ project/exec-wrappers /

  2. conda run Une longue discussion sur la page github de conda sur n moyen standard et rapide pour exécuter une commande dans un environnement a conduit à l'implémentation d'une nouvelle commande (en fait une ré-invocation telle qu'elle était disponible auparavant) : conda run

Il est décrit dans numéro # 732 et sera publié dans conda-4.6 avec un peu de chance en octobre 2018!

4
Agile Bean

Si vous avez juste besoin d'utiliser l'autre python alors je crois que vous devez simplement utiliser le chemin complet vers l'autre python dans votre command .

Essayez d'entrer dans votre executed_env (c'est à dire. source activate executed_env si Linux) et faites which python. Supposons que renvoie HOME/.conda/envs/executed_env/bin/python maintenant qui devient le python que vous utilisez dans votre commande - c'est-à-dire command = "HOME/.conda/envs/executed_env/bin/python executed.py --option1 -dir /path/to/dir". Ce

Par exemple, exécutons executed.py dans une version python différente.

  • Créez votre environnement py27 conda create -n py27 python=2.7 c'est le trigger_env.
  • Créez votre environnement py35 conda create -n py35 python=3.5 c'est le executed_env.
  • Obtenez le chemin complet python vers py35 en exécutant source activate py35 puis which python (appelons cela EXECUTED_PYTHON pour cette description). Désactiver via source deactivate.
  • Ensuite, nous créons executed.py

    import sys
    print(sys.version)
    
  • Puis le trigger.py (inclus les arguments mais ils ne font rien)

    command = "EXECUTED_PYTHON executed.py --option1 -dir /path/to/dir"
    args = shlex.split(command)
    my_subprocess = subprocess.Popen(args)
    
  • Maintenant, exécutons-le dans le trigger_env - source activate py27 et python trigger.py.

  • Cela imprime 3.5.2 |Continuum Analytics, Inc. [...] (3,5 étant la partie importante). Vous pouvez voir qu'il utilise l'autre python dans le executed_env.
2
Paul