2013-10-10 7 views
12

J'ai script1.py qui appelle script2.py (subprocess.call([sys.executable, "script2.py"]). Mais script2.py a besoin de la variable qui est connue en script1.py. J'ai essayé un très simple import x from script1, mais il semble ne pas fonctionner.Importer une variable d'un script python à un autre

Est-ce la bonne approche à utiliser? Par exemple:

#script1.py 
import subprocess, sys 
##subprocess.call([sys.executable, 'C:\\...\\Desktop\\script2.py'], shell=True) 
##os.system("C:\\...\\Desktop\\script2.py") 
subprocess.Popen("C:\\...\\Desktop\\script2.py", shell=True) 
print "BLAH" 
x = BO 

#script2.py 
from script1 import x 
print "HELLO" 
print x 

Tous les 3 cas d'appel SCRIPT2 (subprocess.call, os.system, subprocess.Popen) ne fonctionnent pas. Je reçois "BLAH" mais pas "BONJOUR".

+2

[La syntaxe est correcte] (http://docs.python.org/2/tutorial/modules.html#more-on-modules): 'from script1 import x' –

+0

Oui, je l'ai écrit dans mon code en fait :) comme je l'ai dit ça ne marche pas! – Z77

+0

Peut-être que vous ne m'avez pas bien compris. Je l'ai écrit correctement: depuis script1 import x et ça ne marche pas. – Z77

Répondre

0

Je pense que vous devez vous référer à la variable préfixant son nom du module (c.-à-script1.x) dans script2.py

16

La syntaxe correcte est:

from script1 import x 

donc, littéralement, « de script1 .py importer l'objet "x". "

+0

Et si je veux modifier la valeur de x dans script2 et imprimer une nouvelle valeur dans script1? –

4

Essayez ceci:

from script1 import x 

Je viens de rencontrer les pièces suivantes de code et cela a fonctionné

script1:

c = 10

SCRIPT2:

from script1 import c 
print c 

Le deuxième script a imprimé l'entier 10 comme vous devriez le prévoir. En l'état, le code ne produira pas le "Hello" tel qu'indiqué ou entrera dans une boucle infinie. Quelques problèmes:

En l'état, BO n'est pas défini. Lorsque vous exécutez script1, le sous-processus de script2 est ouvert. Lorsque script2 appelle script1, il imprime blah mais échoue sur x = BO car BO n'est pas défini. Donc, si vous corrigez cela en spécifiant BO avec une chaîne par exemple, cela entrera dans une boucle infinie (chaque script appelant l'autre et imprimant x, Hello et Blah).

Un moyen possible de le réparer est de passer x à travers un appel de fonction. Ainsi, script2 peut prendre x comme paramètre de fonction et faire ce que vous voulez faire avec.

+0

ce n'est probablement plus valide depuis que la question a été traitée –

2

script1.py:

x = 2 
from script2 import * 

script2.py:

from script1 import x 
print x 
3

code Votre est en boucle parce que l'appel subprocess.Popen est dans le code d'initialisation du module, il sera appelé par SCRIPT2 lors de l'importation script1 (création d'un nouveau processus script2 qui importe aussi script1 ...)

The recommended way d'avoir un fichier python utilisable à la fois comme un script et un module est d'utiliser la variable

__name__
#script1.py 

x = BO 

if __name__ == "__main__": 
    import subprocess, sys 
    subprocess.Popen("C:\\...\\Desktop\\script2.py", shell=True) 
    print "BLAH" 

Mais aussi considérer cela ne fonctionne que pour constantes. Si x peut changer à l'exécution, vous aurez besoin d'une méthode de communication interprocessus réelle.

2

Script 0:

#!/usr/bin/env python 
from script1 import x 

print x 

Script 1:

#!/usr/bin/env python 
x = "Hello world" 

Sortie:

Hello world 

Alors oui, il ne fonctionne, pas besoin de sous-processus.

Questions connexes