在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进行通信?如果是这样,怎么样?
提前致谢。
答案 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
然后回到第一个终端,你会看到输出。