这是我最终使用的解决方案。在阅读了Markus's answer 之后,我注意到 Spyder 在os.environ 中添加了六个左右的环境变量,名称如SPYDER_ENCODING、SPYDER_SHELL_ID 等。与检测这些变量中的任何一个相比,检测这些变量的存在似乎相对明确。缺少与'PYTHONSTARTUP' 一样通用名称的变量。代码很简单,并且独立于 Spyder 的启动脚本(据我所知):
if any('SPYDER' in name for name in os.environ)
# use alternative
else:
# use getpass
由于字符串在每个环境变量名称的开头,你也可以使用str.startswith,但它不太灵活,而且速度有点慢(我很好奇):
>>> import timeit
>>> s = timeit.Timer("[name.startswith('SPYDER') for name in os.environ]", "import os")
>>> i = timeit.Timer("['SPYDER' in name for name in os.environ]", "import os")
>>> s.timeit()
16.18333065883474
>>> i.timeit()
6.156869294143846
sys.executable 方法可能有用也可能没用,具体取决于您的安装。我有几个 WinPython 安装和一个单独的 Python 2.7 安装,因此我能够检查条件 sys.executable.find('WinPy') == -1 以检测 Spyder 使用的可执行文件路径中的文件夹名称。由于当您尝试使用 getpass 时在 IDLE 中显示的警告没有可能的“响亮”,在我看来,我最终还检查了条件 sys.executable.find('pythonw.exe') == -1 以使其稍微响亮。仅使用sys.executable,该方法如下所示:
if sys.executable.find('pythonw.exe') == sys.executable.find('WinPy') == -1:
# use getpass
else:
# use alternative
但是由于我希望它可以在其他机器上运行,并且另一个用户修改他们的 WinPython 安装文件夹名称而不是重命名他们的 IDLE 可执行文件的可能性更大,所以我的最终代码使用sys.executable 来检测 IDLE 和 @ 987654336@ 来检测 Spyder,在任何一种情况下都提供“更响亮”的警告,并防止代码在后者中中断。
if any('SPYDER' in name for name in os.environ) \
or 'pythonw.exe' in sys.executable:
password = raw_input('WARNING: PASSWORD WILL BE SHOWN ON SCREEN\n\n' * 3
+ 'Please enter your password: ')
else:
password = getpass.getpass("Please enter your password: ")