簡體   English   中英

將變量從一個python腳本導入另一個

[英]Importing a variable from one python script to another

我有script1.py調用script2.py (subprocess.call([sys.executable, "script2.py"]) 。但是script2.py需要在script1.py已知的變量x 。我嘗試了一個非常簡單的import x from script1 ,但它似乎無法正常工作。

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

#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

所有3個調用script2(subprocess.call,os.system,subprocess.Popen)的情況都不起作用。 我得到“BLAH”而不是“HELLO”。

正確的語法是:

from script1 import x

所以,從字面上看,“從script1.py導入”x“對象。”

試試這個:

from script1 import x

我剛剛運行了以下代碼片段並且工作正常

SCRIPT1:

c = 10

SCRIPT2:

from script1 import c
print c

第二個腳本按預期打印整數10。

10月17日編輯:現在代碼將不會產生指示的“Hello”或將進入無限循環。 幾個問題:

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

所以,如果你通過用一個字符串指定BO來修復它,它將進入一個無限循環(每個腳本調用另一個腳本並打印x,Hello和Blah)。

修復它的一種可能方法是通過函數調用傳遞x。 因此,script2可以將x作為函數參數,並做任何你需要做的事情。

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

python文件用作腳本和模塊的推薦方法是使用__name__變量

#script1.py

x = BO

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

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

script1.py:

x = 2
from script2 import *

script2.py:

from script1 import x
print x

腳本0:

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

print x

腳本1:

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

輸出:

Hello world

所以它確實有效,不需要子流程。

我認為你必須通過在script2.py中為其模塊名稱(即script1.x)添加前綴來引用該變量

使用的方法比必要的更復雜。 修復BO之后(我假設它是一個字符串文字,所以我引用它),並假設腳本位於同一位置,你可以調用script2並獲得你所追求的結果。

請參閱以下內容:

#script1.py
print "BLAH"
x = "BO"

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

$ python script2.py 
BLAH
HELLO
BO

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM