web-dev-qa-db-fra.com

Définir la variable d'environnement Shell via python

J'ai un instrument qui nécessite une variable d'environnement que je veux définir automatiquement à partir du code python. J'ai donc essayé plusieurs façons de le faire, mais aucune n'a réussi. Voici quelques exemples:

  1. J'insère le code suivant dans mon script python

    import os
    os.system("export ENV_VAR=/some_path")
    
  2. J'ai créé le script bash (env.sh) et l'exécute à partir de python:

    #!/bin/bash
    export ENV_VAR=some_path
    
    #call it from python
    os.system("source env.sh")
    
  3. J'ai également essayé os.putenv () et os.environ ["ENV_VAR"] = "some_path"

Est-il possible de définir (exporter) une variable d'environnement en utilisant python, c'est-à-dire sans l'exporter directement vers le shell?

7
Sergey Asryan

Tant que vous démarrez l '"instrument" (un script que je supposais) à partir du même processus, cela devrait fonctionner:

In [1]: os.putenv("VARIABLE", "123")

In [2]: os.system("echo $VARIABLE")
123

Vous ne pouvez pas modifier une variable d'environnement d'un processus différent ou d'un processus parent.

5
Stan Prokop

La définition d'une variable d'environnement la définit uniquement pour le processus en cours et tous les processus enfants qu'elle lance. Donc, en utilisant os.system le définira uniquement pour le shell en cours d'exécution pour exécuter la commande que vous avez fournie. Lorsque cette commande se termine, le shell disparaît, tout comme la variable d'environnement. Le paramétrer à l'aide de os.putenv ou os.environ a un effet similaire; les variables d'environnement sont définies pour le processus Python et ses enfants).

Je suppose que vous essayez de définir ces variables pour le shell à partir duquel vous lancez le script, ou globalement. Cela ne peut pas fonctionner car le Shell (ou un autre processus) n'est pas un enfant du script Python dans lequel vous définissez la variable.

Vous aurez plus de chance de définir les variables dans un script Shell. Si vous puis source ce script (afin qu'il s'exécute dans l'instance actuelle du Shell, plutôt que dans une sous-coque), ils resteront définis après la fin du script.

17
kindall

Selon la façon dont vous exécutez votre instrument, vous pourrez peut-être changer l'environnement spécifiquement pour le processus enfant sans affecter le parent. Voir la documentation pour os.spawn*e ou subprocess.Popen qui accepte un argument distinct désignant l'environnement enfant. Par exemple, Remplacement de la famille os.spawn dans la documentation du module subprocess qui fournit les deux utilisations:

Exemple d'environnement:

os.spawnlpe(os.P_NOWAIT, "/bin/mycmd", "mycmd", "myarg", env)
==>
Popen(["/bin/mycmd", "myarg"], env={"PATH": "/usr/bin"})
0
mike.dld