繁体   English   中英

在运行时导入Python 3.6

[英]Python 3.6 import at runtime

我目前正在编写一个程序,其中将Python文件复制到具有主模块的docker-container中,然后应在Threads中执行。

假设我具有以下结构:

.
├── app.py
├── rule1
|   └── foo.py
├── rule2
|   └── bar.py
:
:   ...
: 
└── ruleX
    └── foobar.py

想法是,子目录中的每个.py都实现一个接口,然后由main.py在其自己的线程中main.py 另一方面, main.py然后与主机上运行的程序进行通信。 线程唯一要做的就是创建已加载类的实例并调用.analyze() -function。

到目前为止,我发现以下代码:

import importlib.util
spec = importlib.util.spec_from_file_location("module.name", "/path/to/file.py")
foo = importlib.util.module_from_spec(spec)
spec.loader.exec_module(foo)
foo.MyClass()

但就我而言,我不确定为module.name输入什么。 以及如何调用该函数?

查找此信息的地方是文档 您显然在某处找到的代码基本上只是文档中的示例之一 ,所有说明和上下文都已删除。

您还需要稍微了解一下Python模块和软件包的工作方式,但是否则,您在此处不了解的所有内容都应在同一文档章节中找到。


但就我而言,我不确定为module.name输入什么。

module.name只是模块的名称。 这是将在回溯中显示的名称,它可能会影响其他调试和反射代码(例如,如果您在任何地方使用inspect ),以及可能从模块内部导入的相对名称。 (我猜想,除了调试输出之外,所有这些都不会影响您,在这种情况下,即使您弄错了它也没有太大关系。)

无论如何,如果不确定,并且希望看到一些示例而不是浏览干燥而混乱的文档,请打开交互式解释器,然后尝试以下操作:

import <whatever>
print(<whatever>.__name__, <whatever>.__file__)

…针对不同的<whatever>值(从stdlib,从PyPI安装的软件包以及从您自己的项目)获得一个想法。 您看到的__name__是由spec_from_file_location下的机器传递给spec_from_file_location的名称。

但简短的版本是:

  • 如果希望rule1像“命名空间包”一样使用,请使用rule1.foo
  • 如果要让rule1像sys.path上的另一个路径一样工作,请使用foo

以及如何调用该函数?

调用类的方式完全相同:

foo.analyze()

最后一件事:您正在构建的是一个非常标准的插件系统,具有最简单的插件API(“必须公开不带参数的函数analyze ”)。 您可能需要四处寻找具有插件系统的其他应用程序,以阅读其代码以获取想法。 (但是请注意,其中许多控件都与Python 2.7或3.3向后兼容,这意味着导入的实际步骤将大不相同,并且您不想使用它们使用的旧代码。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM