使用字符串作为名称导入文件[复制](Import file using string as name

2019-07-17 15:39发布

可能重复:
动态模块导入在Python

我希望尽早做出一套文件,在某些时候,并组织它的最好的办法是有一个列表,该列表将在文件的最顶端,之后它会的代码可笑量处理什么列表控件以及它如何运作。 我期待写说名单只有一次,并表示名单是这种格式的文件夹和文件名的列表:

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

正如你可以看到, folder/filename是相同的(在某种程度上)的。 文件名与文件夹名.py就完了,但这样做你不需要做进口XXX.py进口XXX,所以我不认为这造成的问题。

我现在面临的问题是使用这种方法导入...

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为测试主模块,并最终EVAL它。

正如你所看到的,我目前有有在顶部进口的列表。 我不能简单地做进口testName (内容testName是我要导入的模块的名称),因为它会尝试找到一个名为模块testName ,而不是所谓的内容模块testName

我已经看到了这个地方已经做了几个例子,但找不到任何这在我的环境下工作。 如果有人可以从字面上扔的代码块它做它,这将是美妙的。

我还要求我不挂,画,也不是为驻扎使用eval,它在一个非常可控的环境(通过它的周期是.py文件中的列表中使用,因此没有“最终用户”应惹它)。

Answer 1:

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

mod = __import__(testName)
mod.HelloWorld()

编辑 :我不知道,使用__import__由python文档不赞成为用户代码: __import__文档 (如Bakuriu说明)

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

import importlib

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


Answer 2:

  1. 永远,永远,永远惹sys.modules直接,如果你不知道自己在做什么。
  2. 有很多方法可以做到你想要什么:
    1. 集结在__import__功能
    2. 使用imp.load_module
    3. 使用importlib.import_module

我会避免使用__import__直接,去importlib.import_module (这也是在文档的最后建议__import__ )。



Answer 3:

加入其中,模块驻留到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


文章来源: Import file using string as name [duplicate]