Я думаю, что я наблюдал аналогичную проблему: некоторые процессы начались, казалось, успешно выполнялись, но никогда не завершались. Функция waitFor () ожидала вечно, кроме случаев, когда я убил процесс в диспетчере задач. Однако все хорошо работало в случаях, когда длина командной строки была 127 символов или короче. Если длинные имена файлов неизбежны, вы можете захотеть использовать переменные среды, которые могут позволить вам сохранить строку командной строки коротким. Вы можете сгенерировать командный файл (используя FileWriter), в котором вы устанавливаете свои переменные окружения перед вызовом программы, которую вы действительно хотите запустить. Содержимое такой партии может выглядеть так:
set INPUTFILE="C:\Directory 0\Subdirectory 1\AnyFileName"
set OUTPUTFILE="C:\Directory 2\Subdirectory 3\AnotherFileName"
set MYPROG="C:\Directory 4\Subdirectory 5\ExecutableFileName.exe"
%MYPROG% %INPUTFILE% %OUTPUTFILE%
Последний шаг запускает этот командный файл с использованием Runtime.
Общая техника, которую вы показываете, является наиболее эффективной и простой. Но вы делаете дополнительные задания, которые на самом деле не нужны. Ниже приведена небольшая оптимизация.
elements = []
k1, v1 = heapq.heappop(heap)
elements.append((k1,v1))
while(k1 == heap[0]):
k2, v2 = heapq.heappop(heap)
elements.append((k2,v2))
return elements
Чтобы быть в безопасности, вы, вероятно, должны добавить проверки, чтобы убедиться, что ваша куча не пуста. Проверка heap[0]
, когда в куче нет элементов, будет плохой вещью, как и вызов heapq.heappop
, если куча пуста.
Я собирался предложить изменение структуры с кучи (k, v)
на кучу k
и словарь {k:[v]}
. Это превратит ваш код в:
k = heap[0]
return [(k,v) for v in hash[k]]
С:
hash = defaultdict(list)
heap = []
heappush(heap, (k, v))
станет:
heappush(heap, k)
hash[k].append(v)
heappop(heap)
станет: [1112 ]
k = heappop(heap)
v = hash[k].pop()