4

如果我使用 Python 的交互模式一次键入一个命令,我有一些 Python 代码可以按预期工作。如果另存为myscript.py并运行为'C:\Python27\python.exe myscript.py'.

如果相同的代码在交互模式下运行,以何种方式将 Python 代码作为脚本运行会导致它崩溃?

这个问题询问如何判断 python 是否处于交互模式。然而,提问者只想要一个单一的、可靠的交互模式指纹。我想要一个交互模式不同的方式列表,特别注意这可能导致的问题。

例如:

  • sys.path可能不同
  • os.getcwd()可能不同
  • os.environ可能不同
  • 这个问题的所有答案
  • 多处理模块文档开头的此警告

Python 的交互模式和脚本模式还有什么不同?

4

3 回答 3

4

Threads 和Greenlets 在交互环境中具有不同的行为。在某些情况下,主事件循环必须被破解。

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
于 2012-05-11T20:20:30.367 回答
1

看起来您正在与硬件进行交互,这带来了 REPL 和脚本之间最明显的区别:

脚本中的命令会尽快运行,而 REPL 则等待人工输入。

也就是说,您可能遇到了时间问题,即硬件在执行上一条命令后还没有为下一条命令做好准备。

于 2012-05-11T20:15:22.317 回答
0

看看这条线

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

如果您可以使用 LoadLibrary 的 COMPLETE 路径

于 2012-05-11T20:40:47.067 回答