使用字符串作为名称导入文件

时间:2012-12-28 14:38:53

标签: python string import path

  

可能重复:
  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")的字符串,对于此示例,打印测试路径,然后将路径添加到列表中({{1} }),然后打印确认它发生了,然后组装一个字符串,由sys.path.append(path)执行测试主模块并最终评估它。

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

我已经看到了一些这样做的例子,但在我的情况下找不到哪些工作。如果有人可以从字面上抛出一大块代码来完成它那将是非常棒的。

我还要求我没有挂起,绘制,也没有四分之一使用eval,它在一个非常受控制的环境中使用(它循环的列表在.py文件中,所以没有“结束用户“应该捣乱它。”

3 个答案:

答案 0 :(得分:32)

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

mod = __import__(testName)
mod.HelloWorld()

修改:我不知道用户代码的python文档不鼓励使用__import____import__ documentation(如Bakuriu所述)

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

import importlib

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

答案 1 :(得分:20)

  1. 如果你不确切地知道自己在做什么,永远不要直接弄乱sys.modules
  2. 有很多方法可以做你想要的:
    1. 内置__import__功能
    2. 使用imp.load_module
    3. 使用importlib.import_module
  3. 我会避免直接使用__import__,并转到importlib.import_module(这也是__import__文档末尾的建议。)

答案 2 :(得分:2)

将模块所在的路径添加到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