Python: code.interact(local=locals()) 在标准输入输出不可用时的应用

9
在Python中,以下代码片段在执行后将打开一个交互式 shell。
import code; code.interact(local = locals())

这在调试不太被文档记录的代码时非常有用。人们可以使用shell来浏览程序环境并找出问题所在,即使没有调试器也可以。目前为止,还不错。
现在的挑战是:
我正在使用的软件(顺便说一下,它是用Django编写的)使用某种调度机制,然后与 其他 Python 进程通信,我无法控制它,除了编辑其代码。除了发送给它进行处理的变量之外,我没有任何输入内容。
但是,由于文档非常贫乏,我不知道代码如何工作,因此我想使用code.interact方法来解决问题。
但是,这个进程是在后台的某个地方启动的,由某些特殊的调度软件发出信号和对象,然后在任意时间(10-200ms之间的任何时间)在完全不同的进程中运行。当收到信号和对象时,标准输入/输出已经不存在了。
所以我认为,与其使用stdin/stdout与code.interact通信,不如通过指定readfunc参数来使用文件句柄或Unix套接字。我尝试过通过open()打开文件和套接字,但没有成功。
现在我正在尝试仅通过Django进程本身让其工作,以便排除调度问题,虽然交互式shell确实启动了,但立即关闭,既不接受包含命令的文件作为内容,也不接受用于传输Python命令的Unix套接字。
长话短说; 有没有可能通过除stdin/stdout之外的其他方式与由code.interact调用的交互式shell进行通信?如果是这样,怎么做?
提前致谢。
1个回答

8
我不完全明白关于调度程序、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

回到第一个终端,你会看到输出结果。


关于进入交互式控制台,我一直在使用code.interact(local=locals()),但我注意到我的箭头键不能让我移动光标,而只是打印出字符代码,如左箭头为^[OD,右箭头为^[OC。是否有恢复典型光标控制的方法? - brneuro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接