[英]In what ways is python different when run in interactive mode?
如果我使用Python的交互模式一次一個地鍵入命令,我有一些Python代碼可以正常工作。 如果保存為myscript.py
並運行為'C:\\Python27\\python.exe myscript.py'
則相同的代碼崩潰。
如果相同的代碼在交互模式下工作,以何種方式運行Python代碼作為腳本會導致它崩潰?
這個問題詢問了如何判斷python是否處於交互模式。 但是,提問者只需要一個可靠的交互模式指紋。 我想要一個交互模式不同的方式列表,特別注意這可能導致的問題。
例如:
Python的交互模式和腳本模式之間還有什么不同?
Thread
和Greenlet
在交互式環境中具有不同的行為。 在某些情況下,主事件循環必須被黑客入侵。
Greenlet
來自gevent
模塊,它是python中的並發任務。 它有一個與Python(pthread)分開的內部上下文切換,並發工作非常好(根據我的經驗)。 Greenlets的一些問題是,如果它們沒有進行猴子修補( gevent
模塊),它們會阻止阻塞C系統調用和套接字交互。
主要的事件循環需要打補丁才能使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
看起來你正在與硬件交互,這帶來了REPL和腳本之間最明顯的區別:
腳本中的命令會立即立即運行,而REPL則等待人工輸入。
也就是說,您可能遇到了一個時序問題,即執行前一個命令后硬件還沒有為下一個命令做好准備。
看看這一行
PCO_api = ctypes.oledll.LoadLibrary("SC2_Cam")
如果可以使用LoadLibrary的COMPLETE路徑
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.