Python:模块导入层次结构(启动时不存在的模块)

没有快速的方法来描述此问题,所以请和我在一起! A similar question was already asked,但我的用例有些不同。解释它的最简单方法是描述一个实际用例:

我有一个包含一些常用实用程序模块的文件夹,这些脚本正在我的脚本中使用。

commonPythonFiles/
    pathUtils.py
    procUtils.py
    specialModuleUtils.py

    groupedCommonPythonFiles/
        groupUtils1.py
        groupUtils2.py (*)

此模块可能具有交叉导入:procUtils使用来自pathUtils.py的函数,而groupUtils1.py使用这两个函数(procUtils.pypathUtils.py)。

有一个特殊的模块,从脚本开始就不可用-通过使用main.py函数在specialModuleUtils.py的运行时中提取/复制/生成/...。

specialModuleFolder/ # not available from the start
    specialModule.py

另一方面,groupUtils2.py (*)是此类specialModule.py的包装。

在某些辅助脚本(例如main.py)中,需要此实用程序模块,因此,它们通常在文件的开头导入。


问题

#main.py
import pathUtils
import procUtils
import specialModuleUtils
import groupUtils1
import groupUtils2 # (!)

def main():
    # prepare special module
    args = groupUtils1.getSpecialModuleArguments(sys.argv) # might be a lot more than one line to get arguments
    specialModuleUtils.create(args)

    # do some stuff with groupUtils2 which use created special module
    groupUtils2.doSomeStuffWithSpecialModule()

您可能已经怀疑我面临的问题。我正在导入尚不可用的模块。 main.pyimport groupUtils2失败,因为尚未创建specialModuleUtils

我实际上遇到的问题是:如何处理导入的正确方法是什么?通常,对于这种非标准情况,最佳的模块层次是什么?


可能的解决方案

  • 设置规则:文件头中不应放置任何通用模块导入。
#main.py
import pathUtils
import procUtils

def main():
    import groupUtils1
    import specialModuleUtils
    # prepare special module
    args = groupUtils1.getSpecialModuleArguments(sys.argv) # might be a lot more than one line to get arguments
    specialModuleUtils.extract(args)

    # do some stuff with groupUtils2 which use created special module
    import groupUtils2
    groupUtils2.doSomeStuffWithSpecialModule()

这会使功能混乱,重复的导入语句并使通用实用程序模块的使用复杂化。

  • 将特殊的模块生成作为脚本的前提条件-main.py应该在已经准备好的环境中运行,并且可以导入specialModule.py。 这意味着,在执行任何脚本之前,需要运行其他一些脚本/作业/进程来准备specialModule.py 此外,此脚本还将限制使用常见的python文件,否则可能会以与main.py相同的方式失败。

由于需要某种逻辑来提取此特殊模块(args = groupUtils1.getSpecialModuleArguments(sys.argv)),因此不能选择简单的虚拟环境(或者是吗?)。

:我真正要解决的问题是:什么是正确的方法来处理导入,或者总的来说,对于这种非标准情况,最佳的模块层次是什么?

cz289548699 回答:Python:模块导入层次结构(启动时不存在的模块)

当然,只有推迟了生成文件的导入,方法是让groupUtils2仅在其函数内部导入(或作为 assign 一旦成功导入了global,就可以使用groupUtils2导入模块,或者通过将main导入(仅)到specialModule中。这些都不是深刻的重组。

本文链接:https://www.f2er.com/3065259.html

大家都在问