我试图为我的jenkins服务器编写一个清理脚本。在没有涉及太多细节的情况下,我想从每个docroot中的文件中获取一个变量,并在for循环中将其与某些内容进行匹配。
所以,似乎每个谷歌的结果都告诉我,我尝试将docroot添加到sys.path.append(docroot),然后使用imp查找模块,使用
导入它imp.find_module('python_vars')
from python_vars import git_branch
并使用变量。
这里的问题是它适用于第一个,但它已经加载了,并且在循环中没有变化。所以我试图在每次迭代结束时从sys.path中删除docroot,然后使用
重新加载下一个模块。reload('python_vars')
from python_vars import git_branch
这给了我一个'reload()参数必须是模块'。和
reload(python_vars)
from python_vars import git_branch
给我' NameError:name' python_vars'未定义'
Tbh,这似乎是一种可怕的方式,是否有更简单的方法从文件中获取变量?
在php中我会做一些类似的事情 在循环中包含(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)
答案 0 :(得分:1)
您可以使用execfile评估Python文件的内容。
e.g。说这是内容-(void)registarPushNotification:(UIApplication*)application
{
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)
{
UIUserNotificationType types = UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert;
UIUserNotificationSettings *mySettings = [UIUserNotificationSettings settingsForTypes:types categories:nil];
[application registerUserNotificationSettings:mySettings];
[application registerForRemoteNotifications];
}
else
{
[application registerForRemoteNotificationTypes:(UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert)];
}
}
:
vars.py
然后git_branch = 'feature/awesome'
可以:
script.py
当然这只是在全局范围内进行了评估,这可能有点危险,所以更安全的选择是传入一个dict来存储在execfile('./vars.py')
print git_branch
评估的全局变量:
vars.py
答案 1 :(得分:-2)
您需要实际获取对模块的引用才能重新加载它:
# First:
import python_vars
# Then:
do_something_with(python_vars.git_branch)
# Later on
reload(python_vars)