[英]Detect where Python code is running (e.g., in Spyder interpreter vs. IDLE vs. cmd)
這是我最終使用的解決方案。 在閱讀了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
由於字符串位於每個環境變量名稱的開頭,因此您也可以使用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
方法可能有用,也可能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: ")
默認情況下,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
Spyder提供了在本機系統終端中執行當前編輯器腳本的選項。 這將產生與從命令行運行時相同的行為。 要進行設置,請點擊F6
打開“運行設置”對話框。 然后選擇單選按鈕“在外部系統終端中執行”。 現在通過按F5
運行腳本。 您應該可以通過這種方法以正常方式使用getpass
。
您可以在Spyder中運行時添加env變量並在代碼中進行檢查。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.