3

我在那里尝试的每个调试器都需要一个源文件来调试。然而,Python 并不总是以这种方式工作。

我有一个模块,它是一个文件夹,里面有__init__.py文件__main__.py,除其他外,我通常这样执行:

$ cd /parent/folder
$ python3 -m module_folder --help

如果我不使用-m,则相对导入失败。如果我只是将文件夹传递给pudbpdb其他人,调试器将失败:

$ cd /parent/folder
$ python3 -m pdb module_folder
Traceback (most recent call last):
  File "/usr/lib64/python3.3/pdb.py", line 1658, in main
    pdb._runscript(mainpyfile)
  File "/usr/lib64/python3.3/pdb.py", line 1536, in _runscript
    with open(filename, "rb") as fp:
IsADirectoryError: [Errno 21] Is a directory: 'module_folder'
Uncaught exception. Entering post mortem debugging
Running 'cont' or 'step' will restart the program
> /usr/lib64/python3.3/pdb.py(1536)_runscript()
-> with open(filename, "rb") as fp:
(Pdb)

我该如何调试呢?最好使用pudb, 并且不删除相对导入。

4

2 回答 2

4

把它放在你的顶部__main__.py

#!/usr/bin/env python3

# Declare itself as package if needed
if __name__ == '__main__' and __package__ is None:
    import os, sys, importlib
    parent_dir = os.path.abspath(os.path.dirname(__file__))
    sys.path.append(os.path.dirname(parent_dir))
    __package__ = os.path.basename(parent_dir)
    importlib.import_module(__package__)

# Continue with your code
do_things()

这样,这两个命令就变得等价了:

  1. cd /parent/folder; python -m module_folder
  2. python /parent/folder/module_folder/__main__.py

只需使用第二种语法进行调试:

pudb /parent/folder/module_folder/__main__.py

或者

python3 -m pdb /parent/folder/module_folder/__main__.py

这同样适用于 Python 2。

您可以安全地从上面的代码中删除该部分__name__ == '__main__' and,因为正如您所写的那样__main__.py,它始终是True. 但是,这是一种常见的做法。请参阅PEP 366其他答案

于 2014-01-02T11:02:31.193 回答
1

我想你想这样做:

$ cd /parent/folder
$ python3 -m pdb -m module_folder

事实上,你错过了第二个-m让 Python 认为它module_folder是要运行的脚本的名称。

于 2013-12-23T13:07:03.897 回答