如何使用编组脚本编写 p4 更改更改列表创建 python
How to script p4 change changelist creation with marshalled python
我正在尝试使用 -G 全局选项编写创建新 p4 更改列表的脚本。这与 -i 命令标志相结合应该允许我通过标准输入将更改列表描述作为编组 python 字典传递。不幸的是,我找不到 p4 记录这段代码格式的任何地方。
如果我使用编组字典查看现有的更改列表,我会看到:
>>> argx=["/usr/bin/p4","-G", "change", "-o", "12345"]
>>> p=subprocess.Popen(argx, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
>>> c=p.communicate()
>>> c
>>> marshal.loads(c[0])
{'Status': 'pending', 'code': 'stat', 'Description': 'test\t\n', 'Client': 'myclient', 'User': 'me', 'Date': '2015/02/18 18:36:34', 'Type': 'public', 'Change': '12345'}
所以我试着用这种方式创建一个:
>>> x={'Change': 'new', 'Status': 'new', 'Description': "p4test"}
>>> y=marshal.dumps(x)
>>> args=["/usr/bin/p4","-G", "-d", "/tmp", "change", "-i"]
>>> p=subprocess.Popen(args, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
>>> c=p.communicate(y)
>>> marshal.loads(c[0])
{'generic': 34, 'code': 'error', 'data': 'Invalid marshalled data supplied as input.\n', 'severity': 3}
(这不是很有帮助)
但是,如果我查看未编组的 return,我会看到其中嵌入:
('{s\x04\x00\x00\x00codes\x05\x00\x00\x00errors\x04\x00\x00\x00datas+\x00\x00\x00Invalid 作为输入提供的编组数据。\ns\x08\x00\x00\x00severityi\x03\x00\x00\x00s\x07\x00\x00\x00generici"\x00\x00\x000{s\x04\x00\x00\x00codes\x05\x00\x00\x00errors\x04\x00\x00\x00datas@\x00\x00\x00更改规范错误。\n缺少必填字段 \'Change\'.\ns\x08\x00\x00\x00severityi\x03\x00\x00\x00s\x07\x00\x00\x00generici\x04\x00\x00\x000', '')
所以 1. 消息编组和解组的方式不兼容,我没有看到具体的错误消息,但是我的 'Change' 字段格式有问题,
或 2. 缺少必填字段消息是由 p4 的编组代码中的脏缓冲区引起的红鲱鱼。
无论哪种方式,我都不知道该怎么做。有什么建议么?我试图避免必须引入 p4 python API 因为它 应该 考虑到大多数事情(不涉及编辑器)的脚本编写是多么容易是不必要的在P4。不过,我现在要开始调查这个问题,因为我已经对此进行了太多的试错。
我想你只需要改变你的dumps
调用来指定数据格式的版本,像这样:
y=marshal.dumps(x, 0)
有关编组模块数据格式版本的详细信息,请参见https://docs.python.org/2/library/marshal.html#marshal.version。
Perforce 知识库也有一些这方面的信息,但您必须知道要搜索什么才能找到它!几年前我偶然发现了同样的问题,并花了几天时间来解决这个问题。
http://answers.perforce.com/articles/KB/3518/?l=en_US&fs=RelatedArticle
When using "marshal.dump()" in Python 2.4 or later, you must specify version "0" of the dump format or P4 cannot understand the data that is being sent.
我刚刚对其进行了测试,我可以使用手动构建的字典作为输入成功创建一个新的更改列表。
运行 在尝试使用编组字典来提供表单数据时创建客户端时也会遇到此问题 - 即使在向转储提供版本 0 时也是如此。
将 p4 命令行工具的版本升级到 Rev. P4/NTX64/2015.1/1415928 (2016/07/25) 成功了。
在修订版 P4/NTX64/2014.2/962050 (2014/11/13)
我正在尝试使用 -G 全局选项编写创建新 p4 更改列表的脚本。这与 -i 命令标志相结合应该允许我通过标准输入将更改列表描述作为编组 python 字典传递。不幸的是,我找不到 p4 记录这段代码格式的任何地方。
如果我使用编组字典查看现有的更改列表,我会看到:
>>> argx=["/usr/bin/p4","-G", "change", "-o", "12345"]
>>> p=subprocess.Popen(argx, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
>>> c=p.communicate()
>>> c
>>> marshal.loads(c[0])
{'Status': 'pending', 'code': 'stat', 'Description': 'test\t\n', 'Client': 'myclient', 'User': 'me', 'Date': '2015/02/18 18:36:34', 'Type': 'public', 'Change': '12345'}
所以我试着用这种方式创建一个:
>>> x={'Change': 'new', 'Status': 'new', 'Description': "p4test"}
>>> y=marshal.dumps(x)
>>> args=["/usr/bin/p4","-G", "-d", "/tmp", "change", "-i"]
>>> p=subprocess.Popen(args, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
>>> c=p.communicate(y)
>>> marshal.loads(c[0])
{'generic': 34, 'code': 'error', 'data': 'Invalid marshalled data supplied as input.\n', 'severity': 3}
(这不是很有帮助) 但是,如果我查看未编组的 return,我会看到其中嵌入:
('{s\x04\x00\x00\x00codes\x05\x00\x00\x00errors\x04\x00\x00\x00datas+\x00\x00\x00Invalid 作为输入提供的编组数据。\ns\x08\x00\x00\x00severityi\x03\x00\x00\x00s\x07\x00\x00\x00generici"\x00\x00\x000{s\x04\x00\x00\x00codes\x05\x00\x00\x00errors\x04\x00\x00\x00datas@\x00\x00\x00更改规范错误。\n缺少必填字段 \'Change\'.\ns\x08\x00\x00\x00severityi\x03\x00\x00\x00s\x07\x00\x00\x00generici\x04\x00\x00\x000', '')
所以 1. 消息编组和解组的方式不兼容,我没有看到具体的错误消息,但是我的 'Change' 字段格式有问题, 或 2. 缺少必填字段消息是由 p4 的编组代码中的脏缓冲区引起的红鲱鱼。
无论哪种方式,我都不知道该怎么做。有什么建议么?我试图避免必须引入 p4 python API 因为它 应该 考虑到大多数事情(不涉及编辑器)的脚本编写是多么容易是不必要的在P4。不过,我现在要开始调查这个问题,因为我已经对此进行了太多的试错。
我想你只需要改变你的dumps
调用来指定数据格式的版本,像这样:
y=marshal.dumps(x, 0)
有关编组模块数据格式版本的详细信息,请参见https://docs.python.org/2/library/marshal.html#marshal.version。
Perforce 知识库也有一些这方面的信息,但您必须知道要搜索什么才能找到它!几年前我偶然发现了同样的问题,并花了几天时间来解决这个问题。
http://answers.perforce.com/articles/KB/3518/?l=en_US&fs=RelatedArticle
When using "marshal.dump()" in Python 2.4 or later, you must specify version "0" of the dump format or P4 cannot understand the data that is being sent.
我刚刚对其进行了测试,我可以使用手动构建的字典作为输入成功创建一个新的更改列表。
运行 在尝试使用编组字典来提供表单数据时创建客户端时也会遇到此问题 - 即使在向转储提供版本 0 时也是如此。
将 p4 命令行工具的版本升级到 Rev. P4/NTX64/2015.1/1415928 (2016/07/25) 成功了。
在修订版 P4/NTX64/2014.2/962050 (2014/11/13)