2014-02-04 3 views
1

Я планирую передать скрипт кода пользователя на журнал python, запустить его с помощью python bdb, а затем зарегистрировать вывод в файле.Python IOError: [Errno 24] Слишком много открытых файлов

Вот мой код в питона регистраторе:

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

Здесь выход результат выполнения, и мы будем писать его в файл с именем файла.

Я проверил три строки в функции финализатора, и они прошли нормально.

Однако, когда они были вызваны из питона регистратору, я всегда получаю следующее сообщение об ошибке:

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

Можете ли вы показать весь трассу? – user2357112

+0

Добавлена ​​информация о TraceBack, строка 24 в exec.py указывает на outfile = open (имя файла, 'a'). Я подозреваю, что проблема в pdb-потоке не может открыть/закрыть файл должным образом? Заранее спасибо! –

+0

Возможно, вам захочется проверить другие места, в которых ваша программа открывает файлы. Возможно, это не источник утечки. – user2357112

ответ

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() 
Смежные вопросы