如何检查文件是否从 python 脚本打开

how to check file is opened from python scrip

我需要检查文件是否以 perforce 方式打开:

if((p4.run("opened", self.file) != True):

但这不是正确的方式我认为它总是正确的 你能帮忙解决这个问题吗 谢谢

p4.run("opened") returns 与打开的文件对应的结果列表(字典),如果在您提供的路径规范内没有打开文件,则该列表将为空。尝试只打印出值,或者更好的是 运行 它在 REPL 中,以更好地理解函数 returns:

>>> from P4 import P4
>>> p4 = P4()
>>> p4.connect()
P4 [Samwise@Samwise-dvcs-1509687817 rsh:p4d.exe -i -r "c:\Perforce\test\.p4root"] connected
>>> p4.run("opened", "//...")
[{'depotFile': '//stream/test/foo', 'clientFile': '//Samwise-dvcs-1509687817/foo', 'rev': '2', 'haveRev': '2', 'action': 'edit', 'change': 'default', 'type': 'text', 'user': 'Samwise', 'client': 'Samwise-dvcs-1509687817'}]
>>> p4.run("opened", "//stream/test/foo")
[{'depotFile': '//stream/test/foo', 'clientFile': '//Samwise-dvcs-1509687817/foo', 'rev': '2', 'haveRev': '2', 'action': 'edit', 'change': 'default', 'type': 'text', 'user': 'Samwise', 'client': 'Samwise-dvcs-1509687817'}]
>>> p4.run("opened", "//stream/test/bar")
[]

我们可以看到 运行 p4 opened //stream/test/foo 给了我们一个包含一个文件的列表(因为 foo 是打开编辑的),而 p4 opened //stream/test/bar 给了我们一个空列表(因为 bar 不对任何东西开放)。

在 Python 中,如果列表为空则为“虚假”,如果非空则为“真实”。这与 == False== True 不同,但它确实适用于大多数其他需要布尔值的上下文,包括 if 语句和 not 运算符:

>>> if p4.run("opened", "//stream/test/foo"):
...     print("foo is open")
...
foo is open
>>> if not p4.run("opened", "//stream/test/bar"):
...     print("bar is not open")
...
bar is not open

以这种方式使用列表被认为是完美的 Pythonic(这就是语言中存在“真实性”概念的原因)而不是使用明确的 True/False 值.

如果您确实需要一个精确的 TrueFalse 值(例如从声明为 return 精确布尔值的函数中 return),您可以使用 bool 函数将真值转换为 True 并将假值转换为 False:

>>> bool(p4.run("opened", "//stream/test/foo"))
True
>>> bool(p4.run("opened", "//stream/test/bar"))
False

或使用 len() 比较,这相当于同一件事:

>>> len(p4.run("opened", "//stream/test/foo")) > 0
True
>>> len(p4.run("opened", "//stream/test/bar")) > 0
False