Air*_*Air 3 python interpreter spyder
Python 中是否有一种方法可以检测进程中正在执行该进程的位置?我有一些包含该getpass.getpass()函数的代码,该函数在 Spyder中已损坏,并且一直在命令行和 IDE 之间来回切换很烦人。如果我可以添加如下代码会很有用:
if not being run from Spyder:
use getpass
else:
use alternative
Run Code Online (Sandbox Code Playgroud)
这是我最终使用的解决方案。看完后Markus的答案,我注意到,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
Run Code Online (Sandbox Code Playgroud)
由于字符串位于每个环境变量名称的开头,您也可以使用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
Run Code Online (Sandbox Code Playgroud)
该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
Run Code Online (Sandbox Code Playgroud)
但是由于我希望它在其他机器上工作,并且另一个用户更有可能修改他们的 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: ")
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6806 次 |
| 最近记录: |