使用FIFO运行不带stdin / stdout的pdb

时间:2010-06-23 12:57:37

标签: python bash pdb

我正在用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)没有stdin / stdout运行pdb是否更好/其他方式?

2)如何将stdin重定向到pdb.in fifo(我输入的所有内容必须转到pdb.in)?我怎样才能将pdb.out重定向到stdout(我的“cat pdb.out”有奇怪的错误,但也许我听不懂)

3 个答案:

答案 0 :(得分:6)

确定。正是我想要的,已在http://pypi.python.org/pypi/rpdb/0.1.1中完成。

答案 1 :(得分:4)

在启动python app之前

mkfifo pdb.in
mkfifo pdb.out

然后,当调用pdb时,您可以使用这两个cat命令与它进行交互,其中一个命令在后台运行

cat pdb.out & cat > pdb.in

请注意,readline支持不起作用(即向上箭头)

答案 2 :(得分:1)

我在一个更简单的用例中遇到了类似的问题:

  • 调试从命令行运行的简单Python程序,该程序将文件传送到sys.stdin,这意味着无法使用pdb的控制台。

我最后使用wdb解决了这个问题。

我的用例快速破解。在shell中,安装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。有关详细信息,请参阅上面链接中的wdb自述文件。