Это решение убивает дерево процессов в случае оболочки = True, передает параметры процессу (или нет), имеет тайм-аут и получает вывод stdout, stderr и процесс обратного вызова (он использует psutil для kill_proc_tree) , Это было основано на нескольких решениях, размещенных в SO, включая jcollado's. Проводка в ответ на комментарии Ансона и юрида в ответ jcollado. Протестировано в Windows Srvr 2012 и Ubuntu 14.04. Обратите внимание, что для Ubuntu вам необходимо изменить вызов parent.children (...) parent.get_children (...).
def kill_proc_tree(pid, including_parent=True):
parent = psutil.Process(pid)
children = parent.children(recursive=True)
for child in children:
child.kill()
psutil.wait_procs(children, timeout=5)
if including_parent:
parent.kill()
parent.wait(5)
def run_with_timeout(cmd, current_dir, cmd_parms, timeout):
def target():
process = subprocess.Popen(cmd, cwd=current_dir, shell=True, stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE)
# wait for the process to terminate
if (cmd_parms == ""):
out, err = process.communicate()
else:
out, err = process.communicate(cmd_parms)
errcode = process.returncode
thread = Thread(target=target)
thread.start()
thread.join(timeout)
if thread.is_alive():
me = os.getpid()
kill_proc_tree(me, including_parent=False)
thread.join()
Быть ясным, OrderBy
не отсортирует массив на месте - он возвратит новую последовательность, которая является отсортированным копия из массива. Если это хорошо, то Вы хотите что-то как:
var sorted = array.OrderBy(item => item.Fields["FieldName"].Value);
, С другой стороны, я не понимаю Ваш комментарий, что свойство возвращается как строка, но что можно бросить его к интервалу - Вы не можете бросить строки к ints, необходимо проанализировать их. Если это - то, что Вы имели в виду, Вы, вероятно, хотите:
var sorted = array.OrderBy(item => int.Parse(item.Fields["FieldName"].Value));
, Если Вы хотите это как массив, можно звонить ToArray()
впоследствии:
var sorted = array.OrderBy(item => int.Parse(item.Fields["FieldName"].Value))
.ToArray();
, Кроме того, Вы могли использовать Array.Sort
, если Вы хотите отсортировать оперативный, но это будет несколько более грязно.
Используйте Метод сортировки отсортировать массив:
Array.Sort(theArray, (a, b) => String.Compare(a.Fields["FieldName"].Value, b.Fields["FieldName"].Value));
, Если Вы не используете C# 3, Вы используете делегата вместо лямбда-выражения:
Array.Sort(theArray, delegate(Item a, Item b) { return String.Compare(a.Fields["FieldName"].Value, b.Fields["FieldName"].Value); } );
(Это также работает с платформой 2, который не делает расширение OrderBy.)
Если можно использовать orderby, это должно быть легко, попробовать следующее. Я добавил международный Синтаксический анализ, хотя в зависимости от того, как Вы на самом деле хотите отсортировать, это не могло бы требоваться.
var sorted = array.OrderBy(item => int.Parse(item.Fields["FieldName"].Value));
var sortedArray = items.OrderBy(i => i.property).ToArray();
, Если Вы не хотите массива, можно оставить это, в этом случае, у Вас будет IEnumerable<> объекта типа.