gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 21:30:50 25 4
gpt4 key购买 nike

没有快速的方法来描述这个问题,所以请继续关注我! 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)),简单的虚拟环境不是一个选项(或者它们是?)。

:我真正纠结的问题是:处理导入的正确方法是什么,或者一般来说,对于这种非标准情况,最好的模块层次结构是什么?

最佳答案

当然只有生成文件的导入必须延迟,或者通过 groupUtils2仅在其函数内部导入它(或作为显式初始化步骤分配带有 global 的导入模块)或通过导入(仅)groupUtils2main一旦它急切地进口specialModule可以成功。这些都不是深刻的重组。

关于Python:模块导入层次结构(启动时不存在的模块),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58956100/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com