我计划将用户代码脚本传递给python logger,使用python bdb运行它,然后将输出记录在文件中。
这是我在python logger中的代码:
try:
logger._runscript(script_str)
except bdb.BdbQuit:
pass
finally:
logger.finalize(filename)
其中logger.finalize在下面定义为函数终结器(输出,文件名)。
bdb将生成一个新线程并在执行后调用以下终结函数:
def finalizer(output, filename):
outfile = open(filename , 'a')
outfile.write(json.dumps(output, indent = 4))
outfile.close()
这里输出是执行结果,我们将它写入一个带文件名的文件。
我测试了终结器功能中的三条线,它们运行正常。
然而,当从python logger调用它们时,我总是收到以下错误消息:
IOError: [Errno 24] Too many open files: filename
我只打开一个文件,在其末尾添加一个字符串,然后将其关闭。为什么“打开文件太多”?任何人都可以指出我的问题吗?
以下是TraceBack信息:
Traceback (most recent call last):
File "./exec.py", line 95, in <module>
File "./exec.py", line 82, in main
File "./exec.py", line 45, in run
File "path to project/logger.py", line 1321, in exec_script_str
File "path to project/logger.py", line 1292, in finalize
File "./exec.py", line 24, in finalizer
IOError: [Errno 24] Too many open files: 'test01.py'
答案 0 :(得分:0)
这看起来不像标准库中的记录器。相反,您似乎正在尝试使用提供沙箱环境的第三方library。其中一个限制是它禁止文件访问(参见line 1233)。
如果您自己创建记录器对象,可以通过使用适当的标志创建禁用这些安全检查,例如。
def exec_str_with_user_ns(script_str, user_ns, finalizer_func):
logger = PGLogger(False, False, False, finalizer_func, disable_security_checks=True)
try:
logger._runscript(script_str, user_ns)
except bdb.BdbQuit:
pass
finally:
return logger.finalize()