2015-10-19 111 views
2

我正在嘗試爲我的jenkins服務器編寫一個清理腳本。沒有進入太多細節,我想從每個docroot中的文件中獲取一個變量,並在for循環中將其與某些內容匹配。從另一個python文件獲取變量無需導入

所以,看似每一個谷歌的結果告訴我,我嘗試添加的文檔根目錄到sys.path.append(文檔根目錄),然後用小鬼找到模塊,採用

imp.find_module('python_vars') 
from python_vars import git_branch 

其導入並使用該變量。

這裏的問題是,它適用於第一個,但它已經加載,並不會在循環中更改。所以我想在每次迭代的末端,除去從sys.path中的文檔根目錄,然後重新加載模塊使用

reload('python_vars') 
from python_vars import git_branch 

下一個這給了我一個「重載()的參數必須是模塊」。而

reload(python_vars) 
from python_vars import git_branch 

給我「NameError:名字‘python_vars’沒有定義」

TBH,這似乎是一個可怕的方式做到這一點,是不是有一個更簡單的方法來從文件中獲取變量?

在php中,我只是在循環中執行一些類似 include(docroot)的操作,它會覆蓋內存中的變量並完成操作。

下面是完整的循環,我完全知道它是垃圾,但我現在只是在嘗試一些東西。

if os.path.exists(docroot): 
     sys.path.append(docroot) 
     # If docroot exists need to check if it is meant to 
     import imp 
     try: 
       imp.find_module('python_vars') 
       from python_vars import git_branch 
       remove_project = check_for_git_branch(docroot, git_branch) 
     except ImportError: 
       remove_project = True 
       print 'importerror' 
     try: 
       imp.find_module('python_vars') 
       reload(python_vars) 
       from python_vars import git_branch 
     except ImportError: 
       print 'nope' 

     sys.path.remove(docroot) 

回答

1

您可以評估使用execfile Python文件的內容。

例如之所以這樣說,是內容vars.py

git_branch = 'feature/awesome' 

然後script.py可以這樣做:

execfile('./vars.py') 
print git_branch 

當然,這剛剛在全球範圍內評估,這可能是有點危險,所以更安全的選擇會在一個字典來存儲全局評價了vars.py經過:

vars = {} 
execfile('./vars.py',vars) 
print vars['git_branch'] 
-2

你需要真正抓住到模塊的引用,以便能夠重新加載它:

# First: 
import python_vars 

# Then: 
do_something_with(python_vars.git_branch) 

# Later on 
reload(python_vars) 
+0

所以我不得不也許什麼也不做登記,作爲AR功能添加eference? –

+0

@MichaelMallett不,只是導入模塊,因爲我告訴你。你能發佈你的完整代碼嗎?你提到了一個循環,但是我沒有在你發佈的代碼中看到一個循環。 –

+0

啊道歉,當你說我需要獲取一個參考時,我認爲以你所處的方式傳遞變量的行爲是在做某件特定的事情。因此,導入完整的文件,而不是變量,並將'check_for_git_branch(docroot,git_branch)'改成'check_for_git_branch(docroot,python_vars.git_branch)',然後重新加載就足夠了? –

相關問題