Я думаю you't, просто отсутствующий эти -c
флаг. Например:
:.!python -c "print 'hello'"
Вы не должны, что сценарий, что Вы обеспечиваете действия как фильтр на выборе строки. Таким образом, Ваш сценарий может читать от stdin
для работы непосредственно на данные строки (.
, %
...). Что-то большее чем самые простые задачи, однако, и Вы были бы более обеспеченным помещением команд Python в собственный файл сценария.
Я не уверен, почему Firefox не доволен этим, но по опыту могу сказать, что в IE6 / 7 / 8 необходимо установить innerHTML = ""; на объекте, который вы хотите удалить из DOM. (если вы создали этот элемент DOM динамически, то есть)
$ ("# content tbody"). empty ();
может не освобождать эти динамически сгенерированные элементы DOM.
Вместо этого попробуйте что-то вроде следующего ( это плагин jQuery, который я написал для решения проблемы).
jQuery.fn.removefromdom = function(s) {
if (!this) return;
var bin = $("#IELeakGarbageBin");
if (!bin.get(0)) {
bin = $("<div id='IELeakGarbageBin'></div>");
$("body").append(bin);
}
$(this).children().each(
function() {
bin.append(this);
document.getElementById("IELeakGarbageBin").innerHTML = "";
}
);
this.remove();
bin.append(this);
document.getElementById("IELeakGarbageBin").innerHTML = "";
};
Вы бы назвали это так: $ ("# content"). removefromdom ();
Единственная проблема здесь в том, что вам нужно заново создавать свою таблицу каждый раз, когда вы хотите ее построить.
Кроме того, если это решит вашу проблему в IE, вы можете прочитать об этом больше в блоге сообщение , которое я написал ранее в этом году, когда столкнулся с той же проблемой.
Edit Я обновил плагин выше, чтобы он теперь на 95% свободен от JavaScript, поэтому он использует больше jQuery, чем предыдущая версия. Вы все равно заметите, что мне нужно использовать innerHTML, потому что функция jQuery html (""); не действует так же для IE6 / 7/8
Изменить Я обновил плагин выше, чтобы он теперь на 95% свободен от JavaScript, поэтому он использует больше jQuery, чем предыдущая версия. Вы все равно заметите, что мне нужно использовать innerHTML, потому что функция jQuery html (""); не действует так же для IE6 / 7/8
Изменить Я обновил плагин выше, чтобы он теперь на 95% свободен от JavaScript, поэтому он использует больше jQuery, чем предыдущая версия. Вы все равно заметите, что мне нужно использовать innerHTML, потому что функция jQuery html (""); не действует так же для IE6 / 7/8
Я не уверен насчет утечки, но ваша функция resetTable ()
очень неэффективна. Попробуйте сначала исправить эти проблемы и посмотрите, чем вы закончите.
Новый код:
<html> <head>
<title>Test Page</title>
<script type="text/javascript"
src="http://ajax.googleapis.com/ajax/libs/jquery/1.3/jquery.min.js"></script>
</head> <body>
<script type="text/javascript">
$(function()
{
var $tbody = $("#content tbody");
function kickoff() {
$.getJSON("test.php", resetTable);
}
function resetTable(rows)
{
var html = ''
, i = 0
, l = rows.length
, row;
for ( ; i < l; i++ )
{
row = rows[i];
html += "<tr>"
+ "<td>" + row.mpe_name + "</td>"
+ "<td>" + row.bin + "</td>"
+ "<td>" + row.request_time + "</td>"
+ "<td>" + row.filtered_delta + "</td>"
+ "<td>" + row.failed_delta + "</td>"
+ "</tr>";
}
$tbody.html( html );
setTimeout(kickoff, 2000);
}
kickoff();
});
</script>
<table id="content" border="1" style="width:100% ; text-align:center">
<thead>
<th>MPE</th> <th>Bin</th> <th>When</th> <th>Filtered</th> <th>Failed</th>
</thead>
<tbody></tbody>
</table>
</body> </html>
Ссылки:
Пожалуйста, поправьте меня, если я ошибаюсь, но разве SetTimeout (fn) не предотвращает освобождение памяти вызывающего абонента? Чтобы все переменные / память, выделенная во время метода resetTable (rows), оставались выделенными до завершения цикла?
В этом случае передача конструкции строки и логики appendTo другому методу может быть немного лучше, поскольку эти объекты получат освобождается после каждого вызова, и в памяти останется только память возвращенного значения (в данном случае либо строковая разметка, либо ничего, если новый метод выполнил appendTo ()).
По сути:
Первоначальный вызов для kickoff
-> Вызов resetTable ()
-> -> SetTimeout Вызывает повторный запуск
-> -> -> Вызывает resetTable () снова
-> -> -> -> Продолжать до бесконечности
Если код так и не разрешится, дерево будет продолжать расти.
Альтернативный способ освобождения некоторой памяти на основе этого был бы похож на приведенный ниже код:
function resetTable(rows) {
appendRows(rows);
setTimeout(kickoff, 2000);
}
function appendRows(rows)
{
var rowMarkup = '';
var length = rows.length
var row;
for (i = 0; i < length; i++)
{
row = rows[i];
rowMarkup += "<tr>"
+ "<td>" + row.mpe_name + "</td>"
+ "<td>" + row.bin + "</td>"
+ "<td>" + row.request_time + "</td>"
+ "<td>" + row.filtered_delta + "</td>"
+ "<td>" + row.failed_delta + "</td>"
+ "</tr>";
}
$("#content tbody").html(rowMarkup);
}
Это добавит разметку к вашему телу и затем завершит эту часть стека. Я почти уверен, что каждая итерация «строк» все равно останется в памяти; однако строка разметки и тому подобное должны в конечном итоге освободиться.
Опять же ... прошло много времени с тех пор, как я смотрел SetTimeout на этом низком уровне, поэтому здесь я могу полностью ошибиться. В любом случае это не устранит утечку и только, возможно, снизит скорость роста. Это зависит от того, как сборщик мусора используемых движков JavaScript справляется с циклами SetTimeout, как здесь.
function resetTable(rows) {
appendRows(rows);
setTimeout(kickoff, 2000);
}
function appendRows(rows)
{
var rowMarkup = '';
var length = rows.length
var row;
for (i = 0; i < length; i++)
{
row = rows[i];
rowMarkup += "<tr>"
+ "<td>" + row.mpe_name + "</td>"
+ "<td>" + row.bin + "</td>"
+ "<td>" + row.request_time + "</td>"
+ "<td>" + row.filtered_delta + "</td>"
+ "<td>" + row.failed_delta + "</td>"
+ "</tr>";
}
$("#content tbody").html(rowMarkup);
}
Это добавит разметку к вашему телу, а затем завершит эту часть стека. Я почти уверен, что каждая итерация «строк» все равно останется в памяти; однако строка разметки и тому подобное должны в конечном итоге освободиться.
Опять же ... прошло много времени с тех пор, как я смотрел SetTimeout на этом низком уровне, поэтому я могу полностью ошибиться. В любом случае это не устранит утечку и только, возможно, снизит скорость роста. Это зависит от того, как сборщик мусора используемых движков JavaScript справляется с циклами SetTimeout, как здесь.
function resetTable(rows) {
appendRows(rows);
setTimeout(kickoff, 2000);
}
function appendRows(rows)
{
var rowMarkup = '';
var length = rows.length
var row;
for (i = 0; i < length; i++)
{
row = rows[i];
rowMarkup += "<tr>"
+ "<td>" + row.mpe_name + "</td>"
+ "<td>" + row.bin + "</td>"
+ "<td>" + row.request_time + "</td>"
+ "<td>" + row.filtered_delta + "</td>"
+ "<td>" + row.failed_delta + "</td>"
+ "</tr>";
}
$("#content tbody").html(rowMarkup);
}
Это добавит разметку к вашему телу, а затем завершит эту часть стека. Я почти уверен, что каждая итерация «строк» все равно останется в памяти; однако строка разметки и тому подобное должны в конечном итоге освободиться.
Опять же ... прошло много времени с тех пор, как я смотрел SetTimeout на этом низком уровне, поэтому я могу полностью ошибиться. В любом случае это не устранит утечку и только, возможно, снизит скорость роста. Это зависит от того, как сборщик мусора используемых движков JavaScript справляется с циклами SetTimeout, как здесь.
Я посмотрел на SetTimeout на этом низком уровне, так что могу ошибаться здесь. В любом случае это не устранит утечку и только, возможно, снизит скорость роста. Это зависит от того, как сборщик мусора используемых движков JavaScript справляется с циклами SetTimeout, как здесь. Я посмотрел на SetTimeout на этом низком уровне, поэтому могу ошибаться здесь. В любом случае это не устранит утечку и только, возможно, снизит скорость роста. Это зависит от того, как сборщик мусора используемых движков JavaScript справляется с циклами SetTimeout, как здесь.