8

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

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

事实证明,这对于调试大量文档不足的代码非常有用。即使没有调试器,也可以使用 shell 导航程序内环境并弄清楚发生了什么。到目前为止,一切都很好。

现在是挑战。

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

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

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

因此,我认为code.interact可以通过指定readfunc参数来使用文件句柄或 Unix 套接字,而不是使用 stdin/stdout 与之通信。我已经通过open()文件和套接字尝试过这个,但无济于事。

现在我试图让它仅仅从 Django 进程本身工作,所以即使是调度问题也是不可能的,虽然交互式 shell 确实启动了,但它立即关闭,既不接受带有命令作为内容的文件,也不接受Python 命令通过管道传输到的 Unix 套接字。

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

提前致谢。

4

1 回答 1

5

我并不完全了解调度程序和 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

回到第一个终端,您将看到输出。

于 2012-08-10T14:33:18.407 回答