关于python:使用字符串作为名称导入文件

Import file using string as name

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Dynamic module import in Python

我打算在不久的将来制作一套文件,组织它的最好方法是有一个列表,这个列表将在文件的最顶端,在它之后,将出现一个荒谬的代码来处理列表控制的内容和它的操作方式。我只想写一次上述列表,上述列表是文件夹和文件名的列表,格式如下:

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

如你所见,folder/filename是相同的(有点)。文件名是文件夹名,末尾带有.py,但执行import-xxx时,您不需要执行import-xxx.py,因此我认为这不会导致问题。

我面临的问题是使用这种方法导入…

1
2
3
4
5
6
7
8
9
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为测试主模块执行,并最终对其进行评估。

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

我已经看到了一些这样做的例子,但是在我的环境中找不到任何有效的例子。如果有人真的能扔下一块代码,那就太好了。

我也会要求我没有挂起,画,或四分之一使用eval,它是在一个非常控制的环境中使用的(它的循环列表在.py文件中,所以没有"最终用户"应该处理它)。


不确定我是否正确理解了所有内容,但您可以使用__import__动态导入模块:

1
2
mod = __import__(testName)
mod.HelloWorld()

编辑:我不知道python文档不鼓励在用户代码中使用__import__:导入文档(如bakuriu所指出的那样)

这也应该有效,并且会被认为是更好的风格:

1
2
3
4
import importlib

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


  • 如果你不知道自己在做什么,永远不要直接和sys.modules搞混。
  • 有很多方法可以满足您的需求:
  • 内置__import__功能
  • 使用imp.load_module
  • 使用importlib.import_module
  • 我会避免直接使用__import__,而使用importlib.import_module(这在__import__的文档末尾也有建议)。


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

    1
    2
    3
    4
    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