打开特定文件时中断python代码

2024-03-29 14:24:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在调试器下运行代码,并在打开文件时停止它。我想这样做,不管是用什么技术打开文件。有两种方法可以打开文件(如果有更多的文件,那么我也希望在该情况下停止代码),并且我希望在执行其中一种文件时停止代码:

with open(filename, "wb") as outFile:

或者

object = open(file_name [, access_mode][, buffering])

这在pdbipdb下可能吗?你知道吗

PS:如果我知道可以手动设置断点,我就不知道文件打开的位置。我还可以grepopen(设置断点,但如果我的代码使用模块,这可能会有问题。另外,如果文件不是通过open以另一种方式打开的(我不知道这是否可能只是猜测,可能是为了附加等),这将不起作用。你知道吗


Tags: 文件方法代码objectaswith情况open
2条回答

理想情况下,您可以在open内置函数中设置断点,但这是不可能的。相反,您可以重写它,并将断点放在那里:

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程序。你知道吗

如果您不知道open调用在哪里,则需要在尽可能早的时间点修补原始的open(例如__main__-guard),如下所示:

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

相关问题 更多 >