Perforce 命令行有一个特殊的开关 -G,据说可以使用 python 的“pickle”序列化格式使其输出成为机器可读的。一般来说,情况确实如此吗?
例如,考虑 p4 -G diff -duw3 <file1> <file2> <file3>
的输出。据我所知,输出是一个序列:pickle、raw diff、pickle、raw diff、pickle、raw diff。它似乎不包含任何可以使人可靠地定位 pickle/diff 边界的分隔符。
我是否遗漏了某些内容,或者这种“机器可读”格式实际上不是机器可读的?如何在其输出中找到 pickle 和原始差异之间的边界?
最佳答案
p4 -G
以未经过 pickle 的 marshal
ed 形式输出其数据。
但是你是对的 - p4 -G diff -duw3
也不会取消marshal
,所以我猜那里有问题。
p4 -G opening
解码很好。但是任何类型的 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] )
关于pickle - 如何解析 Perforce "pickle"二进制输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1712026/