Python中有没有办法在进程中检测该进程的执行位置?我有一些包含该getpass.getpass()
函数的代码,该函数在 Spyder 中被破坏,并且一直在命令行和 IDE 之间来回切换很烦人。如果我可以添加如下代码会很有用:
if not being run from Spyder:
use getpass
else:
use alternative
Python中有没有办法在进程中检测该进程的执行位置?我有一些包含该getpass.getpass()
函数的代码,该函数在 Spyder 中被破坏,并且一直在命令行和 IDE 之间来回切换很烦人。如果我可以添加如下代码会很有用:
if not being run from Spyder:
use getpass
else:
use alternative
这是我最终使用的解决方案。在阅读了Markus 的回答后,我注意到 Spyder 添加了六个左右的环境变量,其os.environ
名称为. 代码很简单,并且独立于 Spyder 的启动脚本(据我所知):SPYDER_ENCODING
SPYDER_SHELL_ID
'PYTHONSTARTUP'
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 使用的可执行文件路径中的文件夹名称。由于当您尝试使用时在 IDLE 中显示的警告getpass
没有可能的“响亮”,在我看来,我最终还检查了条件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 和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: ")
默认情况下,Spyder 使用启动脚本,请参阅首选项 -> 控制台 -> 高级设置。此选项通常设置为scientific_startup.py
加载 pylab 等的文件。
最简单的解决方案是在文件中添加一个全局变量,然后在 if 语句中使用它,例如在末尾添加这一行scientific_startup.py
:
SPYDER_IDE_ACTIVE = True
在您的脚本中:
if not 'SPYDER_IDE_ACTIVE' in globals():
use getpass
else:
use alternative
这将工作而不会引发错误。如果您更喜欢例外,也可以使用例外。
第二种解决方案是(如果您由于某种原因无法修改该文件)仅检查是否PYTHONSTARTUP
设置了环境变量。在我的机器上(使用 Anaconda Python 堆栈),它没有设置为常规 Python shell。你可以做
import os
if not 'PYTHONSTARTUP' in os.environ:
use getpass
else:
use alternative
Spyder 提供了在本机系统终端中执行当前编辑器脚本的选项。这将产生与从命令行运行相同的行为。要进行设置,请通过点击 打开“运行设置”对话框F6
。然后选择单选按钮“在外部系统终端中执行”。现在像往常一样通过点击运行脚本F5
。您应该能够以getpass
正常方式使用这种方法。
您可以在 Spyder 中运行时添加 env 变量并在代码中检查它。