debugging 我可以在Bazel测试中使用Python编译器吗

kmpatx3s  于 12个月前  发布在  Python
关注(0)|答案(4)|浏览(245)

我试图使用pdb(Python调试器)调试我的测试,同时使用bazel运行它们。
这是我的一个测试样本:

class TestMembersResource(TestCase):

    def test_get(self):
        response = self.client.get('/api/v1/members/')
        import ipdb; ipdb.set_trace()
        self.assertEqual(response.status_code)

字符串
当我尝试用bazel test ...运行它时,我得到以下输出:

Traceback (most recent call last):
    File "/root/.cache/bazel/_bazel_root/ae988d93859d448ae36776fcb135b36c/execroot/__main__/bazel-out/k8-fastbuild/bin/webserver/members/api/tests/test_members_resource.runfiles/__main__/webserver/members/api/tests/test_members_resource.py", line 22, in test_get
    self.assertEqual(response.status_code, 200,
    File "/root/.cache/bazel/_bazel_root/ae988d93859d448ae36776fcb135b36c/execroot/__main__/bazel-out/k8-fastbuild/bin/webserver/members/api/tests/test_members_resource.runfiles/__main__/webserver/members/api/tests/test_members_resource.py", line 22, in test_get
    self.assertEqual(response.status_code, 200,
    File "/usr/lib/python2.7/bdb.py", line 49, in trace_dispatch
    return self.dispatch_line(frame)
    File "/usr/lib/python2.7/bdb.py", line 68, in dispatch_line
    if self.quitting: raise BdbQuit
BdbQuit


如果没有PDB,一切都运行得很顺利。
有没有一种方法可以获得一个交互式shell,并使用标准的pdb命令与bazel test?
谢谢你,谢谢

iih3973s

iih3973s1#

您可以使用--run_under标志来完成此操作,如前所述。需要注意的是,您需要指向pdb.py以进行python安装。要找到指向的位置,您可以执行以下操作:
检查你的python版本安装在哪里,应该使用python2.7或python3.6,而不仅仅是python3或python3,因为它们通常只是符号链接。

$ which python3.6
/Library/Frameworks/Python.framework/Versions/3.6/bin/python3.6

字符串
请注意,这是二进制文件所在的位置,而我们想要指向一个库文件。为此,将最后一个bin替换为lib,并指定所需的文件,类似于以下内容:

/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/pdb.py


现在你可以像这样运行你的目标:

bazel run --run_under="/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/pdb.py"

91zkwejq

91zkwejq2#

使用--run_under

bazel test --run_under=/usr/bin/pdb //webserver/members/api/tests:test_members_resource

字符串

hfyxw5xn

hfyxw5xn3#

除了使用bazel的--run_under,你也可以在任何地方设置一个breakpoint()(内置函数,不需要导入),然后执行一个普通的bazel run。当解释器命中断点时,它将打开pdb
可选但非常有用:使用pudb通过

pip install pudb
export PYTHONBREAKPOINT="pudb.set_trace"
# add breakpoint() to your code
bazel run PYTHON_TARGET

字符串

eyh26e7m

eyh26e7m4#

不幸的是,bazel test不支持gdbpdb等交互式工具。请参阅此处的讨论和解决方法:
https://github.com/bazelbuild/bazel/issues/11371#issuecomment-692298389

相关问题