我打算在不久的某个时候制作一套文件,最好的方法是组织它是一个列表,该列表将位于文件的最顶层,之后会出现一个荒谬的数量代码来处理列表控制的内容及其操作方式。我只想写一下这个列表,并且列表是这种格式的文件夹和文件名列表:
[(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 eval
(testName
的内容是我要导入的模块的名称),因为它会尝试查找名为testName
的模块,而不是模块称为testName
的内容。
我已经看到了一些这样做的例子,但在我的情况下找不到哪些工作。如果有人可以从字面上抛出一大块代码来完成它那将是非常棒的。
我还要求我没有挂起,绘制,也没有四分之一使用eval,它在一个非常受控制的环境中使用(它循环的列表在.py文件中,所以没有“结束用户“应该捣乱它。”
答案 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)
sys.modules
。我会避免直接使用__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