自从我开始实现工作空间感知以来,我遇到了一个非常奇怪的P4Python问题.
情况如下:
我有一个"P4Commands"模块,它继承了P4并连接在 __init__()
然后,我分别有以下几个类:
P4Commands模块继承P4并调用其父级的"run"方法,同时还注入了我实现的一些自定义缓存,以加速大量调用.run方法被调用如下:
result = super(P4Commands, self).run(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)
然后记录并返回.
当我在一个文件上调用一个操作时,我首先通过P4User来确定该文件所在的工作空间.然后,我在找到匹配的工作空间实例上执行以下操作:
def run(self, *args, **kwargs):
# run whatever commands have to be run, with client temporarily set
# to this instance's client setting.
with self.FUNCS.saved_context(client=self.client) as _:
return self.FUNCS.run(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)
其中FUNCS是P4Commands模块实例.
我得到的问题是,当我在其上调用fstat时返回信息的文件,我将"文件不在客户端上"作为错误,只有当我调用"编辑"命令时.其他所有命令(add,fstat,where等)似乎都能正常工作.这只发生在编辑命令上.
奇怪的是,当我使用完全相同的参数运行方法时,我没有得到错误,但是在工作空间上下文管理器之外(直接在P4User模块上).
它变得更加怪异:我尝试禁用上下文管理器,仍然没有乐趣.
还有一件事要添加到古怪,在阅读本文时,你可能会想"哦,客户端没有正确设置".我尝试记录客户端工作区,并且正确设置和取消设置.就像我说的,所有其他命令都有效,只是没有编辑.
剩下的唯一情况是多个P4模块实例的连接正在干扰.我尝试将P4Commands设置为静态全局,每个模块只共享一个实例.这也没有结束.
我尝试了各种方法,但此时我有点卡住了.有没有人知道如何解决这个问题?
经过大量搜索,我设法解决了这个问题:
我将 P4 连接实例化为类成员,这会扰乱实例,因为每个 P4Workspace 实例都共享相同的连接并试图获取所有权。尽管大多数命令都有效,但这似乎扰乱了连接,导致了上面列出的问题。
我最终解决这个问题的方法是使 P4 继承的类实例成为 P4Workspace 类的实例变量。以前是班级成员。
所以最终工作的结构是: