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

Xtr*_*osh 15 python string import path

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

我打算在不久的某个时候制作一套文件,组织它的最好方法是有一个列表,该列表将位于文件的最顶层,之后将会出现一些荒谬的代码来处理该列表控制的内容及其运行方式.我只想写一次所说的列表,并且列表是这种格式的文件夹和文件名列表:

[(folder/filename, bool, bool, int), (folder/filename, bool, bool, int)]
Run Code Online (Sandbox Code Playgroud)

如你所见,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)
Run Code Online (Sandbox Code Playgroud)

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

如您所见,我目前必须在顶部有一个导入列表.我不能简单地做导入testName(内容testName是我想导入的模块的名称),因为它会尝试查找一个名为的模块testName,而不是一个名为内容的模块testName.

我已经看到了一些这样做的例子,但在我的情况下找不到哪些工作.如果有人可以真正抛出一大堆代码来完成那将是美妙的.

我还要求我没有挂起,绘制,也没有使用eval,它在一个非常受控制的环境中使用(它循环的列表在.py文件中,所以没有"最终用户"应该一塌糊涂).

lbo*_*onn 37

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

mod = __import__(testName)
mod.HelloWorld()
Run Code Online (Sandbox Code Playgroud)

编辑:我不知道__import__用户代码的python文档不鼓励使用__import__文档(如Bakuriu所述)

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

import importlib

mod = importlib.import_module(testName)
mod.HelloWorld()
Run Code Online (Sandbox Code Playgroud)


Bak*_*riu 20

  1. sys.modules如果你不确切知道自己在做什么,永远不要直接搞乱.
  2. 有很多方法可以做你想要的:
    1. 内置__import__功能
    2. 运用 imp.load_module
    3. 运用 importlib.import_module

我会避免__import__直接使用,并继续使用importlib.import_module(这也是文档末尾的建议__import__).

  • 这是用于`import moduleName`,其中moduleName 是字符串。`from moduleName import *` 怎么样? (2认同)
  • @NamGVU尝试导入上面的模块,然后:`globals().update(module .__ dict __)` (2认同)
  • 我在哪里可以找到如何执行此操作的示例?我想运行子文件夹中 Python 脚本中定义的方法。我提供相对路径吗?绝对路径?我要添加“.py”后缀吗? (2认同)