2015-10-19 76 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)',然后重新加载就足够了? –

相关问题