gpt4 book ai didi

python - 检测 Python 代码在哪里运行(例如,在 Spyder 解释器、IDLE 和 cmd 中)

转载 作者:行者123 更新时间:2023-11-28 20:47:57 24 4
gpt4 key购买 nike

在 Python 中有没有一种方法可以检测进程中正在执行该进程的位置?我有一些包含 getpass.getpass() 函数的代码,is broken in Spyder ,而且一直在命令行和IDE之间来回切换很烦人。如果我可以添加如下代码,将会很有用:

if not being run from Spyder:
use getpass
else:
use alternative

最佳答案

这是我最终使用的解决方案。看完Markus's answer ,我注意到 Spyder 向 os.environ 添加了六个左右的环境变量,名称如 SPYDER_ENCODINGSPYDER_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

但由于我希望它能在其他机器上运行,而且与重命名 IDLE 可执行文件相比,其他用户更有可能修改他们的 WinPython 安装文件夹名称,因此我的最终代码使用 sys.executable 检测 IDLE 和 os.environ 检测 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: ")

关于python - 检测 Python 代码在哪里运行(例如,在 Spyder 解释器、IDLE 和 cmd 中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17728395/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com