Yaj*_*ajo 5 python debugging command-line relative-import pudb
我在那里尝试过的每个调试器都需要一个源文件来调试。然而Python并不总是这样工作。
我有一个模块,它是一个文件夹,里面有__init__.py
和__main__.py
文件等,我通常这样执行:
$ cd /parent/folder
$ python3 -m module_folder --help
Run Code Online (Sandbox Code Playgroud)
如果我不使用-m
,相对导入就会失败。如果我只是将文件夹传递给pudb
,pdb
和其他人,调试器将失败:
$ 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)
Run Code Online (Sandbox Code Playgroud)
我该如何调试这个?最好使用pudb
, 并且不删除相对导入。
把它放在你的顶部__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()
Run Code Online (Sandbox Code Playgroud)
这样,这两个命令就变得等效:
cd /parent/folder; python -m module_folder
python /parent/folder/module_folder/__main__.py
只需使用第二种语法进行调试:
pudb /parent/folder/module_folder/__main__.py
Run Code Online (Sandbox Code Playgroud)
或者
python3 -m pdb /parent/folder/module_folder/__main__.py
Run Code Online (Sandbox Code Playgroud)
Python 2 也同样适用。
您可以安全地从上面的代码中删除该部分__name__ == '__main__' and
,因为当您在 中写入时__main__.py
,它始终是True
。然而,放置它是一种常见的做法。请参阅PEP 366和另一个答案。
归档时间: |
|
查看次数: |
3375 次 |
最近记录: |