如何检查文件是否从 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
值.
如果您确实需要一个精确的 True
或 False
值(例如从声明为 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
我需要检查文件是否以 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
值.
如果您确实需要一个精确的 True
或 False
值(例如从声明为 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