2012-05-11 130 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

相关问题