Tee*_*kin 7 python unix django scheduler unix-socket
在Python中,以下代码片段将在执行时打开交互式shell.
import code; code.interact(local = locals())Run Code Online (Sandbox Code Playgroud)
事实证明,这对于在相当多的文档中进行调试非常有用.即使没有调试器,也可以使用shell来导航程序内环境并找出正在发生的事情.到现在为止还挺好.
现在是挑战.
我正在使用的软件(顺便说一下,用Django编写)使用某种调度机制,然后对另一个 Python进程说话,除了编辑代码之外我无法控制.除了我发送给它进行处理的变量之外,我没有任何输入.
但是,由于文档很差,我不知道代码是如何工作的,所以我想用这个code.interact方法来解决问题.
但是这个过程是通过一些特殊的调度软件在后台的某个地方启动的,所以流程不会从Django应用程序转到我想要检查的部分.相反,发送信号和对象,然后在完全不同的过程中在任意时间(10-200ms之间的任何时间)运行.当接收到信号和对象时,stdin/stdout完全不在图片中.
所以我认为不是使用stdin/stdout与之通信,code.interact而是可以通过指定readfunc参数来使用文件句柄或Unix套接字.我通过open()文件和套接字试过这个,但无济于事.
现在我试图仅仅从Django进程本身开始工作,所以即使是调度问题也是不可能的,当交互式shell确实启动时,它立即关闭,既不接受带有命令作为内容的文件,也不接受用于Python命令管道的Unix套接字.
使长话短说; 是否可以code.interact通过除stdin/stdout之外的其他方式调用的交互式shell进行通信?如果是这样,怎么样?
提前致谢.
我并不完全遵循有关调度程序和 django 之类的内容。
但是要回答您问题的核心:
#!/usr/bin/python
import code
f = open('input.txt', 'r')
def readfunc(prompt):
return f.readline()
code.interact(readfunc=readfunc)
Run Code Online (Sandbox Code Playgroud)
然后在一个终端中运行它:
$ ./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)
Run Code Online (Sandbox Code Playgroud)
请注意,您不会收到提示。
然后在另一个终端运行:
echo "globals()" >> input.txt
Run Code Online (Sandbox Code Playgroud)
回到第一个终端,您将看到输出。