Python 生菜圆形进口地雷
我在PyDev中设置了3个项目,它们都在各自的项目参考列表中相互关联。为了说明目的:Python 生菜圆形进口地雷,python,import,project,pydev,lettuce,Python,Import,Project,Pydev,Lettuce,我在PyDev中设置了3个项目,它们都在各自的项目参考列表中相互关联。为了说明目的: proj_f pack_foo mod_fooa (contains class Fooa) mod_foob (contains class Foob) mod_faa (contains class Faa) pack_fii mod_fiia (contains class Fiia) mod_fiib (contai
proj_f
pack_foo
mod_fooa (contains class Fooa)
mod_foob (contains class Foob)
mod_faa (contains class Faa)
pack_fii
mod_fiia (contains class Fiia)
mod_fiib (contains class Fiib)
proj_b
mod_bar (contains function func_bar)
pack_baz
mod_baza (contains class Baza)
mod_bazb (contains class Bazb)
proj_t
tester (what I'm running from)
为了再次举例,测试仪:
from pack_foo.mod_fooa import Fooa
from pack_fii.mod_fiia import Fiia
from mod_bar import func_bar
func_bar(Fooa(), Fiia())
和mod_bar:
from pack_foo.mod_fooa import Fooa
from pack_fii.mod_fiia import Fiia
def func_bar(fooa, fiia):
if not fooa:
fooa = Fooa()
if not fiia:
fiia = Fiia()
fooa.do_magic()
fiia.do_magic()
我看到的是,当我从tester调用一些来自foo的导入时,它们将在mod_栏中获得ImportError:cannotimportname
(关键是,一些但不是全部)。如果我只运行mod_栏,导入工作正常,如果我从mod_栏中删除依赖项和导入,并从tester中运行它,导入工作正常;只有当类的子集从f导入到b和t,并且我从t运行时,它才会中断。我试着阅读有关导入工作原理的文档并在谷歌上搜索解决方案,但我没有找到任何能为我指明正确方向的东西。我觉得这与Python内部的一些模糊部分有关,但我不知道这是什么
我认为这准确地反映了正在发生的事情,尽管从tester
到mod_bar
的引用是间接的,这增加了一层复杂性(tester
是一个文件,我在处理代码时用它来处理代码,而mod_bar
实际上是莴苣地形文件,并且莴苣正由tester
调用的一些其他模块加载。)有谁能至少为我提供一些地方,让我开始查找有关如何克服此问题的信息吗
编辑:
我更详细地研究了这一点,特别是堆栈跟踪:
Traceback (most recent call last):
File "C:\Python27\Lib\site-packages\lettuce\__init__.py", line 53, in <module>
terrain = fs.FileSystem._import("terrain")
File "C:\Python27\Lib\site-packages\lettuce\fs.py", line 74, in _import
module = imp.load_module(name, fp, pathname, description)
File "C:\Users\adminsetup\workspace\nytd_lettuce_lib\terrain.py", line 6, in <module>
from session.session import Session
ImportError: cannot import name Session
回溯(最近一次呼叫最后一次):
文件“C:\Python27\Lib\site packages\莴苣\\uuuu init\uuuuu.py”,第53行,在
terrain=fs.FileSystem.\u导入(“terrain”)
文件“C:\Python27\Lib\site packages\莴苣\fs.py”,第74行,在导入中
模块=imp.load_模块(名称、fp、路径名、说明)
文件“C:\Users\adminsetup\workspace\nytd\u-lib\terrain.py”,第6行,在
从会话。会话导入会话
ImportError:无法导入名称会话
terrain=fs.FileSystem.莴苣中的导入(“terrain”)
。\uu init\uuu()
是否会导致循环导入,这让我头疼?所以是的,我得到了一个循环导入。问题是,当您导入莴苣时,执行莴苣.py,然后动态导入terrain
发生在我身上的是,我有一个会话类,它导入AbstractSession,然后导入LoggerManager,LoggerManager包含一个logging.Handler
子类,它将日志消息推送到world
中的队列中,因此logger\u manager会导入莴苣
以访问world
y测试通过旋转会话对象开始,因此我在terrain中有一个@beforeach
方法在每次测试之前启动会话,这意味着在terrain中导入会话
当然,这意味着每次我在任何地方的任何文件中导入会话时,它都会触发整个事件链(会话>抽象会话>莴苣>地形>会话),当地形尝试加载会话时,它会使Session.Session.Session未初始化
我认为我的最佳解决方案是,将与terrain中的world关联的日志处理程序和日志缓存粘贴到terrain中,然后让terrain附加处理程序本身。幸运的是,这是我的一个选项,因为日志记录是全局访问。这实际上在一定程度上改进了我的框架的划分,因为核心libs中不会有任何与关于莴苣,这些都将在莴苣库中关闭。尽管如此,最好的莴苣没有内置这些地雷
tl;dr,如果您想尝试做任何比真正的基本测试套件更重要的事情,请避免使用莴苣