使用FIFO运行pdb而不依赖stdin/stdout

5 投票
3 回答
2526 浏览
提问于 2025-04-16 00:20

我正在用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 个回答

1

我刚遇到一个类似的问题,但情况简单多了:

  • 我在命令行运行一个简单的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。详细信息可以查看上面链接中的 README。

5

在启动Python应用之前

mkfifo pdb.in
mkfifo pdb.out

当你调用pdb时,可以使用这两个猫命令与它互动,其中一个是在后台运行的

cat pdb.out & cat > pdb.in

注意,readline功能不支持(也就是说,向上箭头键无法使用)

6

好的。正是我想要的,已经在 http://pypi.python.org/pypi/rpdb/0.1.1 上实现了。

撰写回答