我正在尝试将我从bash转换为python的脚本。程序的工作方式是它在顶级文件夹中有一个主脚本,然后在子文件夹中有一些较小的,更专业的脚本。这些较小的脚本可能具有诸如foo_bar.x,bar_foo.x,foo_baz.x,foo_qux.x,bar_qux.x等名称。主脚本将收集变量(在文件或命令行参数中定义)并使用以下语法执行相应的脚本:
VAR1=foo
VAR2=bar
./Scripts/${VAR1}_${VAR2}.x
这将执行Scripts / foo_bar.x
现在我试图在python中做同样的事情。这些脚本现在是名为foo_bar.py,foo_qux.py等模块的文件夹中的模块。目前,他们唯一拥有的是:
def test():
print "This is foo_bar."
(或其中任何一个)。
如果使用这些命令,则会发生这种情况:
>>> import Modules.foo_bar
>>> Modules.foo_bar.test()
This is foo_bar.
>>> import Modules.foo_qux
>>> Modules.foo_qux.test()
This is foo_qux.
>>> a = Modules.foo_bar
>>> a.test()
This is foo_bar.
哪个好。但是,如果我想在import语句中使用变量,我无法正确获得语法。第一个变量定义为命令的字符串输出,第二个变量定义为字典条目。尝试在导入命令中使用它们会产生错误。
>>> var1 = a_file.read_value()
>>> print var1
foo
>>> print dict['var2']
bar
>>> import Modules.var1_dict['var2']
File "<stdin>", line 1
import Modules.var1_dict['var2']
^
SyntaxError: invalid syntax
我认为这是一个正确引用或括号来正确调用变量的问题。我尝试了一堆涉及单引号,大括号,方括号等的组合,但没有骰子。我错过了什么?
答案 0 :(得分:3)
您可以使用importlib
库。并使用这样:
...
import importlib
...
function_call = 'Modules.' + var1 + dict['var2']
function_call = importlib.import_module(function_call)
function_call.test()
答案 1 :(得分:1)
如果要导入名称在变量中的模块,则需要使用__import__
。
例如,让我们创建一个字典,其值是模块的名称:
>>> d = { 1:'re', 2:'numpy' }
现在,让我们导入其中一个:
>>> x = __import__(d[1])
>>> x
<module 're' from '/usr/lib/python2.7/re.pyc'>
我们可以使用该模块,只要我们通过我们给它的名称来引用它:
>>> s='jerry'; x.sub('j', 'J', s)
'Jerry
而且,要导入另一个:
>>> y = __import__(d[2])
>>> y
<module 'numpy' from '/home/jll/.local/lib/python2.7/site-packages/numpy/__init__.pyc'>
>>> y.array([1,3,2])
array([1, 3, 2])
答案 2 :(得分:0)
如何动态执行import语句?
虚拟例子:
d = {"a" : "path"}
exec("import os.%s"%d["a"])
print os.path.abspath(__file__)