我想在调试器下运行代码并在打开文件时停止它。无论打开文件的技术如何,我都希望这样做。 AFAIK有两种打开文件的方式(如果还有更多,那么我想在这种情况下也停止代码)并且我想在其中一个执行时停止代码:
with open(filename, "wb") as outFile:
或
object = open(file_name [, access_mode][, buffering])
这可以在pdb
或ipdb
?
PS:如果我知道我可以手动设置断点,我不知道文件被打开的行。我也可以grep
open(
并在找到的行上设置断点,但如果我的代码使用模块,这可能会有问题。此外,如果文件以另一种方式打开而不是open
(我不知道这是否可能只是猜测,也许是为了附加等),这将无效。
答案 0 :(得分:2)
理想情况下,你会在open builtin函数中放置一个断点,但这是不可能的。相反,您可以覆盖它,并将断点放在那里:
import __builtin__
def open(name, mode='', buffer=0):
return __builtin__.open(name, mode, buffer) # place a BreakPoint here
当然,你会打开任何文件,而不仅仅是你想要的文件。
所以你可以改进一下并放置一个条件断点:
import ipdb
import __builtin__
def open(name, mode='', buffer=0):
if name == 'myfile.txt':
ipdb.set_trace() ######### Break Point ###########
return __builtin__.open(name, mode, buffer)
f = open('myfile.txt', 'r')
使用python -m pdb prog.py
运行您的python程序。
答案 1 :(得分:2)
如果您不知道公开电话的位置,您需要尽可能早地修补原始open
(例如__main__
- 后卫),如下所示:
import __builtin__
_old_open = open
def my_open(*args, **kwargs):
print "my_open"
return _old_open(*args, **kwargs)
setattr(__builtin__, 'open', my_open)
print open(__file__, "rb").read()