没有快速的方法来描述此问题,所以请和我在一起! A similar question was already asked,但我的用例有些不同。解释它的最简单方法是描述一个实际用例:
我有一个包含一些常用实用程序模块的文件夹,这些脚本正在我的脚本中使用。
commonPythonFiles/
pathUtils.py
procUtils.py
specialModuleUtils.py
groupedCommonPythonFiles/
groupUtils1.py
groupUtils2.py (*)
此模块可能具有交叉导入:procUtils
使用来自pathUtils.py
的函数,而groupUtils1.py
使用这两个函数(procUtils.py
和pathUtils.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.py
在import 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)
),因此不能选择简单的虚拟环境(或者是吗?)。
问:我真正要解决的问题是:什么是正确的方法来处理导入,或者总的来说,对于这种非标准情况,最佳的模块层次是什么?
答案 0 :(得分:0)
当然,只有推迟了生成文件的导入,方法是让groupUtils2
仅在其函数内部导入(或作为 assign 一旦成功导入了global
,就可以使用groupUtils2
导入模块,或者通过将main
导入(仅)到specialModule
中。这些都不是深刻的重组。