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:
J'insère le code suivant dans mon script python
import os
os.system("export ENV_VAR=/some_path")
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")
Est-il possible de définir (exporter) une variable d'environnement en utilisant python, c'est-à-dire sans l'exporter directement vers le shell?
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.
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.
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"})