2013-12-23 41 views
2

我在那里试过的每个调试器都需要调试一个源文件。但是Python并不总是以这种方式工作。如何调试需要用-m执行的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,并且不删除相对的进口。

+0

这将是很好,如果有人可以找到一种方法来实现这一点,不需要修改程序源,也不需要改变工作目录。 –

回答

3

__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() 

这样,这2个命令成为等同的:

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

只需使用2号用于调试的语法:

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 366this other answer

0

我想你想这样做:

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

由于这是,你是缺少这是使Python的第二-m认为module_folder本来是要运行的脚本的名称。

+1

这就是我想要做的,但它说'getopt.GetoptError:选项-m不被识别。 – Yajo