2015-03-03 74 views
1

之前,我能夠殺死一個以execfile("somescript.py")開頭的python腳本,而在解釋器中按Ctrl + C而不會終止解釋器。這將導致會停止腳本的異常,並讓我再次使用解釋器。但是,現在(我懷疑這是python的更新版本),當我在運行腳本時按Ctrl + C時,它有時也會殺死解釋器,並將我拋到Linux命令行。由於某些原因,每當我用Ctrl + C殺死一個腳本時就不會發生這種情況。停止運行python腳本而不殺死解釋器

這很煩人,因爲我經常交互地使用python解釋器,也就是說,我運行一些腳本,使用execfile("somescript.py"),在解釋器中產生的數據中玩耍等。之前,如果某個腳本卡住了,我可以殺死它並且在卡住之前不會丟失它計算的數據(或者我已經存儲在變量中)。

所以我的問題是,我現在如何殺死一個在解釋器中以execfile()開頭的python腳本而不會導致解釋器被破壞?

+1

爲什麼不捕獲異常和'break'你正在運行什麼循環? – jonrsharpe 2015-03-03 14:10:56

+0

可能發生腳本意外地在它有機會處理中斷之前完成,並且最終被翻譯抓住。 – BartoszKP 2015-03-03 14:21:49

+0

我不認爲是這種情況,因爲如果我沒有在解釋器中運行的任何東西,我可以按ctrl + C儘可能多地按我的意願解釋並不會被殺死。我認爲這種行爲與我在腳本中使用外部(非python)庫有關,如果我在從這些庫中執行某些內容時終止腳本,整個解釋器就會死亡。 – Echows 2015-03-03 16:37:34

回答

0

通常情況下,這是一個try語句來完成:

>>> def f(): 
...  try: 
...   exec(open("somefile.py").read()) 
...  except Exception as e: print(e) 
... 
>>> f() 
^CTraceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 3, in f 
    File "<string>", line 4, in <module> 
    File "<string>", line 3, in g 
KeyboardInterrupt 
>>> 

somefile.py

def g(): 
    while True: pass 
g() 
+0

我當然可以做到這一點,但我不想用try-catch邏輯混淆我的所有腳本,以防萬一我有時想停止腳本。我問的是如何讓python解釋器像以前一樣工作,也就是說,當我按下Ctrl + C時,解釋器不會被殺死。實際上,現在我嘗試了,如果我只是在無所事事的情況下按Ctrl + C。它在我運行某些腳本時偶爾會被殺死。 – Echows 2015-03-03 16:35:11

+0

@如果問題是間歇性的,那麼您需要重新解決問題。如果您發現問題後無法解決問題,則可以提出另一個問題。 – motoku 2015-03-03 16:36:44