作为软依赖项与p4交互的python接口

xpf的Python项目详细描述


概述

xpf是perforce的一个接口,它提供以下好处:

  • 纯python,无编译依赖项(允许在python 2、python 3、max、maya&;motion builder等中使用)

  • 故障保护呼叫-如果Perforce服务器处于可访问状态,则此模块不会引发错误。

  • PYPI分发使与外包商共享工具变得更容易

安装

下载并放到pythonpath中的某个位置,或者通过pypi安装:

pip安装xpf

为什么不使用p4python

perforce提供了自己的p4python模块,这是一个很好的 稳定库。

p4python的缺点是它是一个编译库,因此需要 如果在python 2.x和python 3.x之间跳转,则使用不同的发行版

如果要将perforce集成到 内置在嵌入式解释器(如autodesk maya/max/motionbuilder)中的工具 它们都是根据与本机不同的编译器版本编译的 python发行版。

xpf带来的另一个好处是它对性能有一个软性要求。 将perforce支持嵌入到 应用程序,如max/maya,但它开启了允许您的工具 当perforce服务器 可进入。

xpf通过确保所有perforce调用都可以返回默认值来解决这个问题。 在无法访问perforce服务器的情况下的变量类型。这个 允许工具在主studio环境之外操作,并且 通过在PYPI上自由访问xpf更容易。

xpf直接

图书馆试图使那些习惯于使用的人易于使用。 p4python或perforce命令行。考虑到这一点,您可以利用 xpf.direct模块模拟调用类型和 p4python.

在这方面,您可以访问每个perforce命令和 你可以提出任何你想提出的论点。按照p4python约定 将返回一个表示结果的词典列表。

例如:

importxpf# -- Sync to the head revision of a directoryxpf.direct.sync(['/usr/my_files/...'])# -- Force sync, passing the usual perforce argument switches, but# -- define the clientxpf.direct.sync(['/usr/my_files/...'],'-f',client='my_client_name',)

除了定义的函数(是自动生成的)之外,还有一个 更通用的运行函数,您可以直接使用:

importxpf# -- Sync to the head revision of a directoryresult=xpf.direct.run('describe',13569,# -- Change list to describe'Os',# -- Shorten output by excluding client workspace data'Rc',# -- Limit output to files mapped into the current workspace.)

使用xpf.direct对使用过 p4python或perforce命令行。

xpf辅助系统

xpf.direct级别工作在 然而,情况是多种多样的 为回答稍高一级的问题而进行的查询。

这些示例可能是将文件添加到变更列表中,而不管 它是一个添加或编辑操作。另一个例子可能是您想要管理的位置 更改列表的描述稍微简单一些。

xpf.assist模块旨在提供更高级别的功能,其中 有问题的函数将执行多个调用并将数据打包以解决 一个特殊的请求。

例如:

importxpf# -- Given a chnagelist description, find the most likely changelist# -- number for the current user. In this case, if that changelist# -- does not exist it will be created for youresult=xpf.assist.get_changelist('My change description')

下面的示例公开了一个提交方法,该方法强制所有 提交要添加到变更列表的文件 说明并一起提交:

importxpfxpf.assist.submit_files(['/usr/my_files/...'],description='My submission description',)

xpf变量

xpf在模块级工作。它不是基于类的,它包装了性能 命令行。考虑到这一点,它有一些变量 全局,在第一次运行时查询(基于p4集),但可以 由您更改。

importxpf# -- Get the hosthost=xpf.variables.get_host()# -- Set the host to something specificxpf.variables.set_host(host)

可以通过这种方式检索和设置的变量包括:

* host
* client
* user
* port (server)
* timeout

可以打开/关闭的一个特殊变量是调试变量。 当调试打开时,xpf将打印任何命令行 过程在最终的格式中,它被构造成。这特别有用 如果你得到了一个你不期望的结果并且想要重新创建步骤 使用命令行。

要启用此选项,请执行以下操作:

importxpfxpf.variables.set_debug(True)

故障保护

xpf的一大优点是它包括内置的故障保护机制 在服务器处于可访问状态时保护功能。在第一次 xpf调用(不管是通过xpf.direct还是 xpf.assist)将运行p4 info查询。如果超时,则 xpf变量设置为将服务器标记为不可访问。

当服务器不可访问时,所有函数都将返回一个默认值 是由他们的故障保护装饰器定义的。这允许您的代码继续 无需直接处理服务器故障。

在许多情况下,当调用xpf.direct中的函数时 服务器故障时返回空列表-这是因为它们的功能 通常返回一个列表。考虑到这一点,同时您不必处理服务器 失败您应该处理被赋予正确(预期)的空数据 类型:

一个很好的例子是:

description=xpf.direct.describe(13569)ifnotdescription:pass...

在上面的例子中,我们必须处理没有给出描述,但是 我们不必处理意外的异常,因为 性能服务器。

从根本上说,这意味着您可以在工具中安全地嵌入xpf依赖项。 提供丰富的用户体验,让用户知道即使使用了 场外。

超时

xpf提供了在所有perforce查询上定义超时的能力。默认情况下 此超时通过xpf.set_timeout(value)公开,并且是默认的 到一秒钟。如果您的服务器速度特别慢,可以使用该调用 增加全局超时。

或者,您也可以在每次调用的基础上设置超时。这是 当你知道你的电话要比预期的时间长的时候特别有用 时间。这是用timeout参数完成的,如下所示:

importxpfxpf.direct.info(timeout=10)

编组

默认情况下,通过xpf运行的所有查询都被封送处理,因此返回 蟒蛇的东西。如果您想要原始输出(字符串),而不是 字典您可以根据每次调用将封送处理设置为false 此处显示:

importxpf# -- Sync to the head revision of a directoryxpf.direct.sync(['/usr/my_files/...'])# -- Force sync, passing the usual perforce argument switches, but# -- define the clientxpf.direct.sync(['/usr/my_files/...'],'-f',client='my_client_name',)
0

表格

perforce中使用表单传递多个用户输入。什么时候? 通过命令行运行perforce这通常会弹出一个文本 编辑器-在与perforce交互时不是特别有用 通过python库。

因此,由特定p4命令请求的所有表单都可以是 以字典的形式给出的。此处显示:

importxpf# -- Sync to the head revision of a directoryxpf.direct.sync(['/usr/my_files/...'])# -- Force sync, passing the usual perforce argument switches, but# -- define the clientxpf.direct.sync(['/usr/my_files/...'],'-f',client='my_client_name',)
1

兼容性

xpf已经在windows和ubuntu上的python 2.7和python 3.7下进行了测试。

注意:本模块使用p4集合环境变量并期望 至少要定义p4port、p4user和p4client。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java筛选hibernate中引用的属性   java如何在Bluej中创建以long(integer)为参数的对象   java如何通过JDBC在access中创建新字段   java如何获取格式化日期?   用模板方法模式设计过滤器接口   java编译错误:缺少返回语句   java从JOOQ中的代码生成中排除特定的模式   java小程序生命周期:init()和start()与destroy()和stop()之间的实际区别是什么?   如何在Java中获取类的所有公共静态方法?   匿名onClick方法内的java活动结果   java如何从数千个具有良好性能的寄存器构建excel工作表?   标记Java中多级中断的适当使用   网络化基于Java的Telnet代理服务器,支持TLS。但为什么是java。网SocketException:连接被拒绝   java将magnolia升级到5.6.1,vaadin资源   springcloudnetflixhystrix中的java重写HystrixCommandSpect bean