【问题标题】:How to parse Perforce "pickle" binary output?如何解析 Perforce“pickle”二进制输出?
【发布时间】:2009-11-10 23:37:14
【问题描述】:

Perforce 命令行有一个特殊的开关,-G,据说它使用 python 的“pickle”序列化格式使其输出是机器可读的。总的来说是这样吗?

例如,考虑p4 -G diff -duw3 <file1> <file2> <file3> 的输出。据我所知,输出是一个序列:pickle、raw diff、pickle、raw diff、pickle、raw diff。它似乎不包含任何分隔符,使人们能够可靠地定位泡菜/差异边界。

是我遗漏了什么,还是这种“机器可读”格式实际上不是机器可读的?如何在其输出中找到泡菜和原始差异之间的界限?

【问题讨论】:

  • 正如道格拉斯所说,这似乎是 p4 的一个错误。您应该为此联系 Perforce 支持(并在此处发布他们的回复)。
  • 如果我得到回复就​​会这样做 - 我使用的是免费的 2 用户许可证,所以我可能不会收到回复。

标签: pickle perforce


【解决方案1】:

p4 -G 以未腌制的marshaled 形式输出其数据。

但你是对的——p4 -G diff -duw3 也不会取消marshal,所以我想那里有问题。

p4 -G opened 解组很好。但是,任何类型的 diff 都会失败。

这是一篇相关的知识库文章:http://kb.perforce.com/ToolsScripts/PerforceUtilities/UsingP4G

#!/usr/bin/env python
import marshal
import subprocess

# proc = subprocess.Popen(["p4","-G","diff","-duw3","configure.ac","Makefile.am"],stdout=subprocess.PIPE)
proc = subprocess.Popen(["p4","-G","diff"],stdout=subprocess.PIPE)
# proc = subprocess.Popen(["p4","-G","opened"],stdout=subprocess.PIPE)
pipe = proc.stdout
output = []
try:
    while 1:
        record = marshal.load(pipe)
        output.append(record)
except EOFError:
    pass
pipe.close()
proc.wait()

# print list of dictionary records
c = 0
for dict in output:
    c = c + 1
    print "\n--%d--" % c
    for key in dict.keys():
        print "%s: %s" % ( key, dict[key] )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-23
    • 2011-03-17
    • 1970-01-01
    • 1970-01-01
    • 2011-11-23
    • 2014-02-20
    相关资源
    最近更新 更多