2013-07-23 4 views
1

J'essaie de définir une variable d'environnement en utilisant python. Et cette variable est utilisée dans un autre script. Mon code est:Définir la variable d'environnement dans un script et utiliser cette variable dans un autre script

#!/usr/bin/env python 
import os 
os.environ['VAR'] = '/current_working_directory' 

après l'exécution ci-dessus script python, j'exécute second script qui utilise la même variable 'VAR', mais il ne fonctionne pas. Mais quand je fais export VAR='/current_working_directory et exécutez le deuxième script, cela fonctionne très bien. J'ai aussi essayé putenv().

Répondre

2

Cela dépend de la façon dont le second script python est appelé.

Si vous avez un shell et que le shell exécute d'abord le premier script python, alors le second ne fonctionnera pas. La raison en est que le premier script python hérite de l'environnement du shell. Mais modifier os.environ[] ou appeler putenv() ne modifiera alors que l'environnement hérité --- celui du second script python, et non celui du script shell. Si maintenant le script shell exécute le deuxième script python, il héritera à nouveau de l'environnement du shell ... et comme le script shell n'est pas modifié, vous ne pouvez pas voir la modification du premier script python.

Une façon de achive votre objectif est d'utiliser un fichier d'aide:

#!/bin/bash 
rm -f envfile 
./first_pythonscript 
test -f envfile && . envfile 
rm -f envfile 
./second_pythonscript 

Ce code est brut, il ne fonctionnera pas si deux instances de l'exécution du script shell, il ne faut pas l'utiliser AS- est. Mais j'espère que vous avez l'idée.

Même une autre façon est de faire de votre second_pythonscript non pas un programme, mais un module Python que le premier_pythonscript peut importer. Vous pouvez également en faire une bibliothèque hybride, lorsqu'elle est importée, lorsqu'elle est exécutée via la construction if __name__ == "__main__":.

Enfin, vous pouvez utiliser l'une des fonctions os, par ex. os.spawnvpe

0

Ce code devrait fournir l'environnement nécessaire à votre 2ème scénario:

#!/usr/bin/env python 
import os 
os.environ['VAR'] = '/current_working_directory' 

execfile("/path/to/your/second/script.py") 
+0

Ce qui est fonctionnellement équivalent à 'sh -c « VAR =/répertoire_travail_actuel exec/chemin/vers/votre/seconde/script.py' (à condition que vous êtes sous Unix, et le second script est correctement chmod + x et a une ligne de shebang correcte). – tripleee

+0

Oui, il fait la même chose, mais sa déclaration était: "J'essaie de définir la variable d'environnement en utilisant python";) – Frodon

0

Un processus enfant ne peut pas changer l'environnement de son processus parent.

La solution de programmation shell générale consiste à faire en sorte que votre premier script imprime la valeur dont vous avez besoin et l'affecte au processus appelant. Ensuite, vous pouvez faire

#!/bin/sh 
# Assign VAR to the output from first.py 
VAR="$(first.py)" 
export VAR 
exec second.py 

ou encore plus succinctement

#!/bin/sh 
VAR="$(first.py)" second.py 

Il est évident que, si la sortie de first.py est trivial d'obtenir sans invoquer Python, qui est souvent une meilleure approche; mais par exemple avoir deux scripts appellent des fonctions différentes d'une bibliothèque et/ou communiquer avec un backend commun, ceci est un modèle commun.

Utiliser Python pour la communication entre deux morceaux de code Python est souvent plus élégant et Pythonic, cependant.

#!/usr/bin/env python 
from yourlib import first, second 
value=first() 
# maybe putenv VAR here if that's really, really necessary 
second(value) 
Questions connexes