目标
之前学习了使用命令行来执行P4操作,调用起来比较方便,不必配置什么环境,但是缺点是,无法对返回信息进行处理。
而使用C++来执行P4操作,功能上比较完善,但缺点就是需要配置环境,调用起来也相对麻烦。
本篇将尝试学习使用Python来执行P4操作。本质上还是对P4命令行进行封装。但是由于可以得到返回的信息,所以可以在Python中通过脚本来对返回的信息进行处理。
python获得命令行返回值
使用python来调用命令行并得到返回值的方法,似乎有很多。不过本篇将选择使用 subprocess模块(这篇知乎也对它有一些介绍)
比如,可以通过下面python脚本来调用p4 info
:
import subprocess
output = subprocess.check_output("p4 info", shell=True)
print(output )
将上面代码保存为py文件,然后用python调用,将会看到:
需要注意的是,正如subprocess模块官方文档所说:
By default, this function will return the data as encoded bytes. The actual encoding of the output data may depend on the command being invoked, so the decoding to text will often need to be handled at the application level.
默认情况下,此函数将数据作为被编码字节返回。 输出数据的实际编码可能取决于被调用的命令,因此通常需要在应用程序级别处理对文本的解码。
所以可以看到上面返回的信息中有\n
\r
的字符。
因此一般要对输出进行解码(decode),例如:
import subprocess
output = subprocess.check_output("p4 info", shell=True)
text = output.decode(encoding='UTF-8')
print(text)
就将会输出:
可以看到\n
已被解码为“换行”。
使用python检查文件是否被别人checkout
注意,这里假设P4服务器已经正常连接,用户已经正常登陆。确认方法可以参考之前的博客中前两部分。
然后注意如果WorkSpace还没设置的话(比如这里的Client unknown),要使用命令SET P4CLIENT=【你的WorkSpace名字】
fstat命令
fstat命令中的otherOpen
显示了是否被别人checkout:
因此它可以用来判断是否被checkout。
比如,可以写个脚本调用它:
import subprocess
command = "p4 fstat d:/Test/TestP4WorkSpace/test2/guaguga.txt"
output = subprocess.check_output(command, shell=True)
text = output.decode(encoding='UTF-8')
print(text)
如果一个文件没有被checkout,则会输出:
如果已经被人checkout了,则会输出:
下面就封装成一个正式的python函数来判断一个文件是否被别人checkout
封装函数
import subprocess
#判断文件是否被别人checkout
def IsCheckout(FilePath):
command = "p4 fstat " + FilePath
output = subprocess.check_output(command, shell=True)
text = output.decode(encoding='UTF-8')
return text.count("otherOpen")>0
#测试调用:
result = IsCheckout("d:/Test/TestP4WorkSpace/test2/guaguga.txt")
print(result)
运行后将会打印出
True