Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/358.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_Project_Pydev_Lettuce - Fatal编程技术网

Python 生菜圆形进口地雷

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

我在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 (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,如果您想尝试做任何比真正的基本测试套件更重要的事情,请避免使用莴苣