Python 3.6运行时导入
我目前正在编写一个程序,其中Python文件被复制到带有主模块的docker容器中,然后应该在线程中执行 假设我有以下结构:Python 3.6运行时导入,python,python-3.x,Python,Python 3.x,我目前正在编写一个程序,其中Python文件被复制到带有主模块的docker容器中,然后应该在线程中执行 假设我有以下结构: . ├── app.py ├── rule1 | └── foo.py ├── rule2 | └── bar.py : : ... : └── ruleX └── foobar.py 其思想是,子目录中的每个.py实现一个接口,然后由main.py在自己的线程中调用。另一方面,main.py则与主机上运行的程序进行通信。 线程唯一需要做的就是创建
.
├── app.py
├── rule1
| └── foo.py
├── rule2
| └── bar.py
:
: ...
:
└── ruleX
└── foobar.py
其思想是,子目录中的每个.py
实现一个接口,然后由main.py
在自己的线程中调用。另一方面,main.py
则与主机上运行的程序进行通信。
线程唯一需要做的就是创建加载类的实例并调用.analyze()
-函数
我发现以下代码:
import importlib.util
spec=importlib.util.spec_from_file_位置(“module.name”、“/path/to/file.py”)
foo=importlib.util.module\u from\u spec(spec)
规范加载程序执行模块(foo)
foo.MyClass()
但在我的情况下,我不确定要为
module.name
输入什么。如何调用函数?查找此信息的位置是。你在某个地方找到的代码基本上只是去掉了所有的解释和上下文
您还需要稍微了解一下Python模块和包是如何工作的,但除此之外,您在这里不了解的内容应该可以在同一文档章节中找到
但在我的情况下,我不确定要为
module.name
输入什么
module.name
只是模块的名称。这是将在回溯中显示的名称,它可能会影响其他调试和反射代码(例如,如果您在任何地方使用inspect
),并且可能会影响模块内的相对导入。(我猜,除了调试输出,所有这些都不会影响您,在这种情况下,如果您弄错了,也没什么大不了的。)
无论如何,如果您不确定,并且希望看到一些示例,而不是深入阅读枯燥而混乱的文档,请打开交互式解释器并尝试以下操作:
import <whatever>
print(<whatever>.__name__, <whatever>.__file__)
最后一件事:您正在构建的是一个非常标准的插件系统,具有最简单的插件API(“必须公开一个不带参数的函数
analyze
)。您可能想四处寻找其他具有插件系统的应用程序,以阅读它们的代码以获取想法。(但请注意,它们中的许多都是向后兼容Python 2.7或3.3的,这意味着导入的实际步骤将非常不同,您不想使用它们使用的旧式代码。)
foo.analyze()