我有一个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回调Traceback中的异常(最近一次调用最后一次):
调用中的文件“ /usr/lib/python2.7/lib-tk/Tkinter.py”,行1544 在myCall中返回self.func(* args)文件“ PATH / main.py”,行1183 name.play() AttributeError:“ str”对象没有属性“ play”
我该如何解决?
答案 0 :(得分:0)
您可以使用eval()
,但请先阅读有关危险的信息:Eval really is dangerous
eval('{}.play()'.format(name))
该字符串的结果为:first.play()
(如果name =='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