Вот мое решение, я использовал Thread и Event:
import subprocess
from threading import Thread, Event
def kill_on_timeout(done, timeout, proc):
if not done.wait(timeout):
proc.kill()
def exec_command(command, timeout):
done = Event()
proc = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
watcher = Thread(target=kill_on_timeout, args=(done, timeout, proc))
watcher.daemon = True
watcher.start()
data, stderr = proc.communicate()
done.set()
return data, stderr, proc.returncode
В действии:
In [2]: exec_command(['sleep', '10'], 5)
Out[2]: ('', '', -9)
In [3]: exec_command(['sleep', '10'], 11)
Out[3]: ('', '', 0)
Addslashes обычно не достаточно хорош при контакте с многобайтовыми закодированными строками.
Это добавляет наклонные черты к:
\x00, \n, \r, \, ', " and \x1a. characters.
, Где addslashes только добавляет наклонные черты к
' \ and NUL
, статья Ilias также довольно подробно изложена на ее функциональности
gs's резко downvoted ответ на самом деле добр из права.
Стандарт использование SQL, удваивающееся для выхода из литерального апострофа. Нестандартное использование MySQL обратных косых черт для выхода является настройкой по умолчанию, но это может быть отключено и часто, в особенности в sql_mode ANSI.
В этом случае только удвоенный синтаксис будет работать, и любое приложение, у Вас есть использование addslashes (или другой специальный метод выхода) повредится. mysql_real_escape_string будет использовать, какой бы ни выход из метода является лучшим для sql_mode соединения.
многобайтовая проблема кодирования также важна при тихом использовании той противной восточноазиатской кодировки, которая снова использует более низкие 128 символов, но затем действительно Вы хотите использовать UTF-8 вместо этого. \n-выход, с другой стороны, не вызывает беспокойства, так как MySQL может отлично счастливо справиться с необработанной новой строкой в операторе.
somedb_real_escape_string()
конкретная база данных, addslashes()
не.
В случае MySQL это означает:
mysql_real_escape_string () называет библиотечную функцию MySQL mysql_real_escape_string, который предварительно ожидает обратные косые черты к следующим символам: \x00, \n, \r, \, ', "и \x1a.
(Из руководства.)
Единственная реальная разница, о которой я знаю, - то, что mysql_real_escape_string () примет набор символов базы данных во внимание при выходе из входной строки. Никакая функция не выйдет из % подстановочных символов и _, который все еще оставляет сценарий открытым для некоторого Внедрения SQL.
Согласно руководство PHP:
mysql_real_escape_string () называет библиотечную функцию MySQL mysql_real_escape_string, который предварительно ожидает обратные косые черты к следующим символам: \x00, \n, \r, \, ', "и \x1a.
Функция mysql_real_escape_string PHP будет, более или менее, спрашивают mysql, какого символа (символов) нужно оставить , где функция addslashses просто добавит обратную косую черту перед и любую одинарную кавычку ('), двойная кавычка ("), обратная косая черта () или NUL (ПУСТОЙ байт) символ.
два практических эффекта, addslashes имеет тенденцию не работать хорошо с многобайтовыми символами, и, что еще более важно, путем выяснения mysql, каких символов нужно оставить, Вы избегаете возможной будущей совместимости. Используя assslashes отчасти похож на жесткое кодирование несколько определенных символов в escape-последовательность.
Это, как предполагается, выходит из строк для MySQL способом, который не делают другие средства заключения в кавычки.
Очень предпочтительный, однако, к , используют интерфейс mysqli и используют параметризованные подготовленные запросы вместо того, чтобы пытаться удостовериться, что всех Ваших строк правильно оставляют. Используя параметрические запросы устраняет потребность в такой грязной строковой работе и сильно снижает риск Внедрения SQL.
Редактирование: я разъяснюсь немного на том, почему я рассматриваю заключение в кавычки плохой идеи: легко забыть, когда и где необходимо заключить в кавычки - должна ли переменная быть строкой или числом, было ли это уже заключено в кавычки и т.д. Параметрический запрос не имеет ни одной из этих проблем , и потребность в заключении в кавычки полностью устранена.