Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 仅导入包的一部分以避免循环导入_Python_Import_Package_Circular Dependency - Fatal编程技术网

Python 仅导入包的一部分以避免循环导入

Python 仅导入包的一部分以避免循环导入,python,import,package,circular-dependency,Python,Import,Package,Circular Dependency,我遇到了循环导入问题,因为我只需要导入包的一部分。当我的程序启动时,我创建了一个驱动程序类,它继承了包中定义的类,但该包的另一个无关部分导入了驱动程序;我需要停止运行包中不相关的部分,直到以后需要它 更多信息:我的程序中有一个接口包。它们只是父对象,其方法和属性与程序中的许多对象相同。它们除了有相似的用途外,没有任何逻辑联系。它们装在一个包裹里完全是为了我的方便;我不希望在顶层有大量的.py文件,而是将它们排序到子文件夹中 软件包如下所示: 接口 __初始值 destroyinterface.p

我遇到了循环导入问题,因为我只需要导入包的一部分。当我的程序启动时,我创建了一个驱动程序类,它继承了包中定义的类,但该包的另一个无关部分导入了驱动程序;我需要停止运行包中不相关的部分,直到以后需要它

更多信息:我的程序中有一个接口包。它们只是父对象,其方法和属性与程序中的许多对象相同。它们除了有相似的用途外,没有任何逻辑联系。它们装在一个包裹里完全是为了我的方便;我不希望在顶层有大量的.py文件,而是将它们排序到子文件夹中

软件包如下所示:

接口
__初始值
destroyinterface.py
图形接口.py

而_u__; init __u; py看起来像这样:

从destroyinterface导入destroyinterface
从图形接口导入图形接口

我想在不初始化graphicsinterface.py的情况下导入DestroyInterface。graphicsinterface.py导入依赖于DestroyInterface的驱动程序,但是如果不初始化graphicsinterface.py,我似乎无法访问DestroyInterface来创建驱动程序

我不想将GraphicsInterface导入从_uuu _uu.py中删除,因为我不希望在导入时必须知道它位于名为GraphicsInterface.py的文件中。在每次导入中包含关于我的包的结构的信息,既增加了样板文件,又使重构更加困难。我希望可以直接从interfaces模块访问这些类以进行导入,但只有在我显式访问它们时,才能初始化它们的.py文件

我也不想在graphicsinterface.py中使用延迟导入驱动程序,因为它很混乱(我只希望在实际需要时初始化文件),而且graphicsinterface的时间敏感方法中的导入会减慢它们的速度


我运气不好吗?我需要以不同的方式对文件进行排序吗?

我建议在图形界面中查看两种解决方案。首先,如果只有两个函数需要驱动程序,请在这些函数中导入驱动程序。导入一个已经导入的模块是有效的,所以在驱动程序中导入它应该很好。 另一种方法是在图形界面中执行以下操作:

driver = None # filled in when driver is imported
然后在别处

import driver
import interfaces.graphics
interfaces.graphics.driver = driver

所以我遇到了一个黑客来解决我的问题。我想我会和你分享的

我的____; init __; py现在看起来像这样:

类疯狂背包(对象):
@财产
def接口(自):
导入crazyhackthing.destroyinterface
返回destroyinterface.destroyinterface
@财产
def图形界面(自):
导入crazyhackthing.graphicinterface
返回graphicinterface.graphicinterface
导入系统
sys.modules[“crazyhackthing”]=sys.modules[“interfaces”]
sys.modules[“interfaces”]=CrazyHack()

这会使此包中的任何导入语句引用其中定义的对象的属性,从而将文件的初始化延迟到显式导入。不知道这在Python3上是否有效,首先这可能是一个糟糕的想法,但它对我有效。愿上帝怜悯我的灵魂