2012-12-28 22 views
8

可能重复:
Dynamic module import in Python导入文件中使用的字符串作为名称

我希望尽早做出一套文件,在某些时候,最好的方式来组织它是有一个列表,该列表将位于文件的最顶端,之后将会有一段荒谬的代码来处理该列表控件以及它的操作方式。我期待写说名单只有一次,并表示名单文件夹和文件名的格式列表:

[(folder/filename, bool, bool, int), (folder/filename, bool, bool, int)] 

正如你所看到的,folder/filename是相同的(在某种程度上)的。文件名是文件夹名称,最后输入.py,但是在导入XXX时,您不需要导入XXX.py,所以我没有看到导致问题的原因。

我面对使用这种方法是进口的问题...

for (testName, auto, hardware, bit) in testList: 
    print(testName) 
    paths = "\\" + testName 
    print paths 
    addpath(paths) 
    sys.modules[testName] = testName # One of a few options I've seen suggested on the net 
    print("Path Added") 
    test = testName + ".Helloworld()" 
    eval(test) 

因此,对于每个测试我有,打印的名字,组装其中包含路径("\\testName")的字符串,在这个例子中,打印测试路径,然后将路径添加到列表(sys.path.append(path)),然后打印以确认发生,然后组装将由测试主模块eval执行的字符串并最终评估它。

正如您所看到的,我目前必须在顶部有一个导入列表。我不能简单地执行导入testNametestName的内容是我希望导入的模块的名称),因为它会尝试找到名为testName的模块,而不是称为testName的内容的模块。

我已经看到了几个这样做的例子,但在我的情况下找不到任何工作。如果有人可以从字面上扔出一大堆代码,那会很棒。

我也会要求我没有被挂起,绘制,也没有使用eval,它被用在一个非常受控的环境中(它循环的列表在.py文件中,所以没有“最终用户“应该搞砸了)。

+0

注意,缩进是正确的ST,由于某种原因,我觉得这只是网站不喜欢正确地分析我的文字:( – XtrmJosh

+1

不要使用制表符,但空间缩进。 –

+2

的Python已经有办法管理您可能想要导入的大量'.py'文件集合,这些文件可以理解文件夹和子文件夹,可以处理相对导入,正确执行命名空间等等,它被称为[package](http:// docs。 python.org/2/tutorial/modules.html#packages)。是否有你不想使用它的原因? – katrielalex

回答

24

不知道如果我理解正确的一切,但你可以导入动态使用__import__模块:

mod = __import__(testName) 
mod.HelloWorld() 

编辑:我不知道,使用__import__由python文档进行劝阻用户代码:__import__ documentation(由Bakuriu说明)

这也应该工作,并会被认为是更好的风格:

mod = importlib.import_module(testName) 
mod.HelloWorld() 
+0

奇妙的是,非常感谢,花了一个多小时的时间搜集了关于它的信息,我尽管之前设法写出__import __(testName),但没有意识到我必须将响应分配给模块或我们,幸运的是,我的所有函数都将在所有文件中被命名为Test,所以我可以从中调用mod.Test()从今起。 – XtrmJosh

+0

@XtrmJosh你见过其他答案吗? '__import__'是一个实现细节;你应该使用'importlib'(如果你不关心Python 3.x兼容性,则使用'imp')。 – katrielalex

16
  1. 如果您不确切地知道自己在做什么,那么千万不要直接与sys.modules混淆。
  2. 有很多方法可以做到你想要什么:
    1. 集结在__import__功能
    2. 使用imp.load_module
    3. 使用importlib.import_module

我会尽量避免使用直接使用__import__,然后使用importlib.import_module(在文档末尾也有提示)。

+1

这是用于'import moduleName'的,其中moduleName是字符串。怎么样'从moduleName导入*'? –

+2

@NGGVU尝试按照上面的方式导入模块,然后:'globals()。update(module .__ dict __)' – Bakuriu

+0

像魅力一样工作。谢谢! –

0

将模块所在的路径添加到sys.path中。使用接受字符串变量作为模块名称的__import__函数导入模块。

import sys 
sys.path.insert(0, mypath) # mypath = path of module to be imported 
imported_module = __import__("string_module_name") # __import__ accepts string 
imported_module.myfunction() # All symbols in mymodule are now available normally 
相关问题