【发布时间】:2019-12-08 17:54:24
【问题描述】:
我能找到的每个文档和答案都说,为了检查程序是否“冻结”(例如 exe),我们可以通过以下方式使用getattr(sys, 'frozen', False):
import sys
if getattr(sys, 'frozen', False):
print('program is frozen exe')
else:
print('program is a .py script')
如果frozen 属性不存在而不是抛出AttributeError,则默认返回False。来自控制台的示例:
>>> getattr(sys, 'frozen')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: module 'sys' has no attribute 'frozen'
>>> getattr(sys, 'frozen', False)
False
>>> hasattr(sys, 'frozen')
False
这一切都很好,但是有一个较短的版本可以完成相同的工作,除非我遗漏了什么:
hasattr(sys, 'frozen')
它只返回True 或False 而无需指定默认值。尽管这更短并且可能更具可读性,但每个在线文档和答案都使用 getattr 代替。我确信我可能忽略了一个聪明的区别,这就是我问这个问题的原因。
引用getattr的示例来源:
【问题讨论】:
-
hasattr只会告诉您该属性是否存在,如果存在则不会返回其值。 -
添加到@ThierryLathuille 的答案,因此通过使用
getattr,您将获得frozen属性的值,如果它是True,则只执行if部分。如果你想使用 hasattr,请使用if hasattr(sys,'frozen') and sys['frozen']:。 -
如果属性存在且其值为
False...? -
我明白你的意思。是否有任何示例说明何时强制
sys.frozen存在并成为False有用?或者任何可以做到这一点的包/扩展/程序? -
感谢您的提问,我发现
PyInstaller手册中缺少True,导致运行时出错:pyinstaller.readthedocs.io/en/stable/runtime-information.html
标签: python pyinstaller executable cx-freeze sys