使用FIFO运行pdb而不依赖stdin/stdout
我正在用Python开发一个FUSE文件系统。问题是,在挂载文件系统后,我无法从我的FUSE脚本访问标准输入(stdin)、标准输出(stdout)和标准错误(stderr)。我什么都看不到,连错误信息都没有。我尝试像这样启动pdb:
import pdb
pdb.Pdb(None, open('pdb.in', 'r'), open('pdb.out', 'w')).set_trace()
一切都正常,但这非常不方便。我想把pdb.in和pdb.out设置成FIFO文件,但不知道怎么正确连接。理想情况下,我希望在一个终端输入命令并看到输出,但即使能在两个终端中实现(一个输入命令,另一个显示输出)也可以。我的问题是:
1) 有没有更好的方法在没有标准输入/输出的情况下运行pdb?
2) 我该如何把标准输入重定向到pdb.in FIFO(我输入的所有内容都必须发送到pdb.in)?我又该如何把pdb.out重定向到标准输出(我在用“cat pdb.out”时遇到了奇怪的错误,但也许是我不太明白)
3 个回答
我刚遇到一个类似的问题,但情况简单多了:
- 我在命令行运行一个简单的Python程序,这个程序的输入是通过文件传递给
sys.stdin
的,所以没法在控制台使用pdb
来调试。
最后我用wdb解决了这个问题。
下面是我使用的步骤。在终端里,先安装wdb服务器和wdb客户端:
pip install wdb.server wdb
然后用以下命令启动wdb服务器:
wdb.server.py
接下来,你可以在浏览器里打开localhost:1984,看到一个界面,上面列出了所有正在运行的Python程序。如果你想调试这些程序,wdb的项目页面上有详细的说明。
如果你想调试一个你控制的程序,可以从一开始就这样做:
wdb myscript.py --script=args < and/stdin/redirection
或者在你的代码里,你可以这样写:
import wdb; wdb.set_trace()
这样会在你的浏览器中弹出一个界面,显示正在追踪的程序。
你也可以访问wdb.server.py的端口,查看所有正在进行的调试会话,列表上会有正在运行的Python程序,你可以选择想要的调试会话。
注意,在追踪代码时,使用的命令和标准的pdb
命令不一样,比如,要进入一个函数,你用.s
而不是s
,要跳过一行用.n
而不是n
。详细信息可以查看上面链接中的
在启动Python应用之前
mkfifo pdb.in
mkfifo pdb.out
当你调用pdb时,可以使用这两个猫命令与它互动,其中一个是在后台运行的
cat pdb.out & cat > pdb.in
注意,readline功能不支持(也就是说,向上箭头键无法使用)
好的。正是我想要的,已经在 http://pypi.python.org/pypi/rpdb/0.1.1 上实现了。