Python:code.interact(local = locals())其中stdin / stdout不可用

时间:2012-08-10 13:21:42

标签: python django unix scheduler unix-socket

在Python中,以下代码片段将在执行时打开交互式shell。

import code; code.interact(local = locals())

这已被证明非常适用于调试很多文档很少的代码。即使没有调试器,也可以使用shell来导航程序内环境并找出正在发生的事情。到目前为止,非常好。

现在是挑战。

我正在使用的软件(顺便说一下,它是用Django编写的)使用某种调度机制,然后对另一个 Python进程说话,我对它无法控制编辑代码。除了我发送给它进行处理的变量之外,我没有任何输入。

但是,我不知道代码是如何工作的,因为文档很差,所以我想使用code.interact方法来解决问题。

但是这个过程是通过一些特殊的调度软件在后台的某个地方启动的,所以流程不会从Django应用程序转到我想要检查的部分。相反,发送信号和对象,然后在完全不同的过程中在任意时间(10-200ms之间的任何时间)运行。当接收到信号和对象时,stdin / stdout完全不在图片中。

所以我认为不是使用stdin / stdout与code.interact进行通信,而是通过指定readfunc参数来使用文件句柄或Unix套接字。我试过open()一个文件和套接字,但没有用。

现在我试图仅仅从Django进程本身开始工作,所以即使是调度问题也是不可能的,当交互式shell确实启动时,它立即关闭,既不接受带有命令的文件内容,也不是管道Python命令的Unix套接字。

长话短说;是否可以通过除stdin / stdout之外的其他方式与code.interact调用的交互式shell进行通信?如果是这样,怎么样?

提前致谢。

1 个答案:

答案 0 :(得分:4)

我并不完全关注调度程序和django等等。

但要回答你问题的核心:

#!/usr/bin/python

import code

f = open('input.txt', 'r')

def readfunc(prompt):
    return f.readline()

code.interact(readfunc=readfunc)

然后在一个终端中运行:

$ ./test.py 
Python 2.7.3 (default, Apr 20 2012, 22:39:59) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)

请注意,您没有得到提示。

然后在另一个终端运行:

echo "globals()" >> input.txt

然后回到第一个终端,你会看到输出。