如何在从另一个脚本中执行python脚本后动态导入变量
我想提取一个名为如何在从另一个脚本中执行python脚本后动态导入变量,python,file,variables,python-3.x,import,Python,File,Variables,Python 3.x,Import,我想提取一个名为value的变量,该变量是在第二个任意选择的python脚本中设置的 在pyhton的交互模式下手动执行时,该过程可以工作,但是当我从命令行运行主脚本时,value不会被导入 主脚本的输入参数已成功转发,但value似乎在已执行脚本的本地范围内 我已经尝试在主脚本中定义value,还尝试将其可访问性设置为全局 这是我到目前为止的剧本 导入系统 导入getopt def总管(argv): 尝试: (opts,args)=getopt.getopt(argv,“s:o:a:”,[“s
value
的变量,该变量是在第二个任意选择的python脚本中设置的
在pyhton的交互模式下手动执行时,该过程可以工作,但是当我从命令行运行主脚本时,value
不会被导入
主脚本的输入参数已成功转发,但value
似乎在已执行脚本的本地范围内
我已经尝试在主脚本中定义value
,还尝试将其可访问性设置为全局
这是我到目前为止的剧本
导入系统
导入getopt
def总管(argv):
尝试:
(opts,args)=getopt.getopt(argv,“s:o:a:”,[“script=”,“operations=”,“args=”)
除了getopt.GetoptError作为e:
打印(e)
系统出口(2)
#要调用的脚本
script=“”
#脚本所需的参数
操作=[]
argv=[]
对于选项中的(opt,arg):
如果选择加入(“-o”,“--operations”):
operations=arg.split(“,”)
打印(“操作='%s'%str(操作))
elif选择加入(“-s”、“脚本”):
script=arg;
打印(“脚本=“%s%”%script)
elif选择加入(“-a”,“-args”):
argv=arg.split(',')
打印(“参数='%s'%str(argv))
#脚本应定义变量“value”
exec(打开(脚本).read())
打印(“已执行“%s”。值打印在下面。”%script)
打印(“值='%s'”%Value)
如果名称=“\uuuuu main\uuuuuuuu”:
main(sys.argv[1:])
如果需要动态导入,可以使用
impmodule = __import__("modulename") # no .py suffix needed
然后通过以下步骤参考value
impmodule.value
有几种方法可以达到相同的结果。
如@cdarke建议使用locals()
生成正确的结果,请参见本主题上的
exec(open(script).read())
print("Executed '%s'. Value is printed below." % script)
print("Value = '%s'" % locals()['value'])
exec
已将value
变量放入本地词典,但编译器不可见。您可以这样检索它:
print("Value = '%s'" % locals()['value'])
我更喜欢
导入
解决方案以什么方式失败?具体点。错误类型、消息、意外行为等等。您是否尝试过导入?这通常比我编辑的问题更安全。我的意思是,该值不是导入的。如果需要动态导入,请使用impmodule=\uuu import\uuuu(“modulename”)
然后通过impmodule.value
参考value
,使用locals()['value']可以在exec
之后获得值
确保从作为参数提供的模块文件名中省略.py后缀。我使用变量script
作为参数,因此它包含后缀,这是错误吗?是的,我认为是。尝试硬编码模块名称而不使用。py@mike:如果script.endswith('.py'):script=script[:-3]
问题似乎是导入的脚本缺少正确设置的环境。它抱怨没有定义名称“操作”
。可以在中设置更多参数。