检测Python代码的运行位置(例如,在Spyder解释器与IDLE与cmd之间)

时间:2013-07-18 15:56:02

标签: python interpreter spyder

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

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

4 个答案:

答案 0 :(得分:4)

这是我最终使用的解决方案。阅读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

但是因为我希望这可以在其他机器上运行,并且更有可能另一个用户修改他们的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: ")

答案 1 :(得分:2)

默认情况下,Spyder使用启动脚本,请参阅首选项 - >控制台 - >高级设置。此选项通常设置为加载pylab等的scientific_startup.py文件。

最简单的解决方案是只在文件中添加一个全局变量,然后在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

答案 2 :(得分:1)

Spyder提供了在本机系统终端中执行当前编辑器脚本的选项。这将产生与从命令行运行时相同的行为。要进行此设置,请按F6打开“运行设置”对话框。然后选择单选按钮“在外部系统终端中执行”。现在通过点击F5照常运行脚本。您可以使用此方法以正常方式使用getpass

答案 3 :(得分:0)

你可以在Spyder中运行时添加env变量并在代码中检查它。