我有一个python程序
main.py
并且我使用此函数从文件夹导入所有动态创建的文件:
def loadImports(path):
files = os.listdir(path)
imps = []
for i in range(len(files)):
name = files[i].split('.')
if len(name) > 1:
if name[1] == 'py' and name[0] != '__init__':
name = name[0]
imps.append(name)
file = open(path+'__init__.py','w')
toWrite = '__all__ = '+str(imps)
file.write(toWrite)
file.close()
loadImports('MyDIR/')
from MyDIR import *
有几个脚本:
first.py
second.py
third.py
每个脚本都有一个函数:
def play():
pass
当我从main.py调用它时,它工作得很好,如下所示:
def myCall(self):
first.play()
self.myCall()
但是我有一个tkinter comboBox,我想从其中选择脚本的名称,例如:
优先
和
这样叫它:
def myCall(self):
name = self.myComboBox.get()
name.play()
self.myCall()
但是有一个错误:
Tkinter回调跟踪中出现
异常(最近一次调用):
文件"/usr/lib/python2.7/lib-tk/Tkinter.py",第1544行,在call return self.func(*args)文件"PATH/main.py",第1183行,在myCall name.play() AttributeError中:'str‘对象没有属性'play’
我怎么才能修复它呢?
发布于 2018-06-23 21:03:25
你可以使用eval()
,但首先要了解它的危险:Eval really is dangerous
eval('{}.play()'.format(name))
字符串的结果是:first.play()
(如果名称==‘first’显然是...)然后eval
运行它。
更新
我想了一个更好的方法,不使用eval
创建一个字典,在加载的模块名称和对模块的引用之间建立关联。
""" Module first.py contains:
def play(recording):
print('Playing:', recording)
"""
import first
first.play('Testing') # Testing that it works
module_dict = {'first': first} # Creating a dict with associations between
# names and module references
module = module_dict.get('first', None) # Get reference from name
# Returns None if no module found
if module: module.play('For real') # Use function from named module if not None
https://stackoverflow.com/questions/50999539
复制相似问题