2012-05-11 46 views
4

我有some Python code,如果我使用Python的交互模式一次一個地鍵入命令,它的工作方式與預期的一樣。如果保存爲myscript.py並以'C:\Python27\python.exe myscript.py'運行,則相同的代碼會崩潰。python在交互模式下運行時有什麼不同?

如果相同的代碼在交互模式下工作,以什麼方式將Python代碼作爲腳本運行會導致崩潰?

This question要求如何判斷python是否處於交互模式。但是,提問者只需要一個可靠的交互模式指紋。我想要一個交互模式不同的方式列表,特別要注意可能導致的問題。

例如:

  • sys.path可能是不同
  • os.getcwd()可能是不同
  • os.environ可以在多模塊開始有所不同
  • 所有答案this question
  • This warning文檔

Python的交互式和腳本模式還有什麼不同?

+0

我不認爲這些問題與SYS或OS將永遠是不同的,因爲Interative的對比兩個版本(腳本)在相同的上下文中運行。換句話說,如果你使用「python script.py」或「python -i」,從任何給定的目錄中,cwd,路徑和環境都是相同的。 –

+0

當你說「在迭代模式」,你說的是運行「python -i」,還是你在談論通過IDLE運行?這兩者之間肯定存在一些差異。 –

+0

好問題,布萊恩奧克利。在這個問題中,我正在考慮'python myscript.py'與'python -i'並手動輸入相同的命令。如果你對你的斷言充滿信心(cwd,路徑和環境將是相同的),我會編輯我的問題以刪除我的誤導性陳述。 – Andrew

回答

1

它看起來像你的硬件,這帶來了REPL和腳本之間最明顯的區別交互:

命令立即以儘快運行腳本,而REPL等待人類輸入。

也就是說,您可能有一個計時問題,硬件在執行之前很快就沒有爲下一個命令做好準備。

+0

非常好的一點。在我參考的硬件特定問題中,我會嘗試在每個命令之間添加time.sleep(1)。 – Andrew

+0

好吧,我試圖在我的硬件相關問題中的所有命令之間添加'time.sleep(1)'。行爲是一樣的。所以,對這個問題的很好回答,似乎並不能解決另一個問題。 – Andrew

3

Thread s和Greenlet在交互式環境中具有不同的行爲。在某些情況下,主事件循環必須被破解。

Greenlet來自gevent模塊,它是python中的併發任務。它具有與Python(pthread)分開的內部上下文切換,併發性非常好(根據我的經驗)。 Greenlets的一些問題是,如果它們沒有被猴子修補,它們會阻止C系統調用和套接字交互(模塊位於gevent)。

爲了讓greenlet正常工作,主事件循環需要打補丁......如果你在交互式環境中產生一個greenlet,它將不會切換上下文並執行,我忘記了我的頭頂如何修補主事件循環(稍後添加)。失敗的

例子:

In [1]: from gevent.greenlet import Greenlet 

In [2]: def print_hi(): 
    ...:  print 'hi' 
    ...:  

In [3]: print_hi() 
hi 

In [4]: g = Greenlet(print_hi) 

In [5]: g.start() 

編輯:

尋找一些在這個項目上的代碼後這裏是我們如何破解IPython的輸入鉤使用GEVENT

import sys 
import select 
import gevent 

def stdin_ready(): 
    infds, outfds, erfds = select.select([sys.stdin], [], [], 0) 
    if infds: 
     return True 
    else: 
     return False 

def inputhook_gevent(): 
    try: 
     while not stdin_ready(): 
      gevent.sleep(0.001) 
    except KeyboardInterrupt: 
     pass 

    return 0 

# install the gevent inputhook 
from IPython.lib.inputhook import inputhook_manager 
inputhook_manager.set_inputhook(inputhook_gevent) 
inputhook_manager._current_gui = 'gevent' 

# First import the embeddable shell class 
from IPython.frontend.terminal.embed import InteractiveShellEmbed 

修補示例:

In [6]: def say_hi(): 
    ...:  print "hi" 
    ...:  

In [7]: g = gevent.greenlet.Greenlet(say_hi) 

In [8]: g.start() 

In [9]: hi <-- Cursor is here so it printed hi 
+0

這聽起來像是很好的信息。不過,我不知道小菜是什麼。如果你詳細說明,它可能會教育我。 – Andrew

+0

偉大的編輯,更多的信息。當然不是我懷疑的東西。 – Andrew

0

在該行

PCO_api = ctypes.oledll.LoadLibrary("SC2_Cam") 

看看如果你可以使用完整的路徑調用LoadLibrary

相關問題