簡體   English   中英

在交互模式下運行時python有什么不同?

[英]In what ways is python different when run in interactive mode?

如果我使用Python的交互模式一次一個地鍵入命令,我有一些Python代碼可以正常工作。 如果保存為myscript.py並運行為'C:\\Python27\\python.exe myscript.py'則相同的代碼崩潰。

如果相同的代碼在交互模式下工作,以何種方式運行Python代碼作為腳本會導致它崩潰?

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

例如:

  • sys.path可能不同
  • os.getcwd()可能不同
  • os.environ可能會有所不同
  • 這個問題的所有答案
  • 多處理模塊文檔開頭的此警告

Python的交互模式和腳本模式之間還有什么不同?

ThreadGreenlet在交互式環境中具有不同的行為。 在某些情況下,主事件循環必須被黑客入侵。

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.

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