簡體   English   中英

檢測Python代碼的運行位置(例如,在Spyder解釋器與IDLE與cmd之間)

[英]Detect where Python code is running (e.g., in Spyder interpreter vs. IDLE vs. cmd)

Python中是否有一種方法可以在進程中檢測正在執行該進程的位置? 我有一些包含getpass.getpass()函數的代碼,該函數在Spyder已損壞 ,並且一直在命令行和IDE之間來回移動很煩人。 如果可以添加以下代碼,這將很有用:

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

這是我最終使用的解決方案。 在閱讀了Markus的回答之后 ,我注意到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方法可能有用,也可能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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM