如何从其他动态创建的文件调用函数。 Python

时间:2018-06-23 08:53:36

标签: tkinter python-import

我有一个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”

我该如何解决?

1 个答案:

答案 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