2013-10-10 136 views
12

我有script1.py,它調用script2.py (subprocess.call([sys.executable, "script2.py"])。但是script2.py需要在script1.py中已知的變量x。我嘗試了一個非常簡單的import x from script1,但它似乎不起作用。從一個python腳本導入變量到另一個

這是正確的使用方法嗎? 例如:

#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 

三種情況下都調用SCRIPT2的(subprocess.call,使用os.system,subprocess.Popen)不工作。我得到「BLAH」,但不是「HELLO」。

+2

[正確的語法是](http://docs.python.org/2/tutorial/modules.html#more-on-modules):'from script1 import x' –

+0

是的,我在我的代碼中寫了如此:)因爲我說它不起作用! – Z77

+0

也許你不瞭解我。我正確地寫了它:從script1導入x並且它不起作用。 – Z77

回答

0

我想你一定在script2.py前綴的模塊名稱(即script1.x)是指在可變

16

正確的語法是:

from script1 import x 

所以,從字面上看,「從SCRIPT1 .py導入「x」對象。「

+0

如果我想修改script2中x的值並在script1中輸出新值,該怎麼辦? –

4

試試這個:

from script1 import x 

我只是跑下面的代碼片段,它的工作

SCRIPT1:

c = 10

SCRIPT2:

from script1 import c 
print c 

第二個腳本按照您的預期輸出整數10。

Oct 17編輯: 因爲它代表將不會產生如所示的「你好」或將進入無限循環。幾個問題:

就目前而言,BO是未定義的。當你執行script1時,script2的子進程打開。當script2調用script1時,由於BO未定義,它將打印出blah,但在x = BO上失敗。

所以,如果你修復指定BO與說一個字符串,它會進入一個無限循環(每個腳本調用另一個印刷X,您好,布拉赫)。解決它

一個可能的方式是通過函數調用來傳遞X。所以,script2可以將x作爲函數參數,並執行您需要的任何操作。

+0

由於該問題已被編輯,因此這可能不再有效 –

2

script1.py:

x = 2 
from script2 import * 

script2.py:

from script1 import x 
print x 
3

你的代碼是循環,因爲subprocess.Popen通話是在模塊初始化代碼,則其將被SCRIPT2導入時被調用script1(創建一個新的script2進程也導入script1 ...)

具有可同時作爲腳本和模塊Python文件的The recommended way是使用__name__變量

#script1.py 

x = BO 

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

但也考慮常量這僅適用。如果x可以在運行時更改,則需要實際的進程間通信方法。

2

腳本0:

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

print x 

腳本1:

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

輸出:

Hello world 

所以是它的工作,無需子流程。

相關問題