#python #minizinc #keyboardinterrupt
Вопрос:
Я решаю задачу раскраски графов с помощью minizinc. Запуск процесса выглядит так
mz_output = subprocess.run(["minizinc", "--time-limit", "10000", "--no-intermediate", "-p 4", "graph_coloring.mzn", "data.dzn"],
shell=False, stdout=subprocess.PIPE).stdout.decode('utf-8')
Это прекрасно работает для некоторых графиков, но для графика с 1000 узлами и ~250000 ребрами он выдает KeyboardInterrupt
:
Traceback (most recent call last):
File "submit.py", line 458, in <module>
main(parser.parse_args())
File "submit.py", line 390, in main
results = compute(metadata, args.override)
File "submit.py", line 181, in compute
submission = output(problem.input_file, solver_file)
File "submit.py", line 222, in output
solution = pkg.solve_it(load_input_data(input_file))
File "D:CourseraDiscreteColoringcoloringsolver.py", line 73, in solve_it
shell=False, stdout=subprocess.PIPE).stdout.decode('utf-8')
File "D:programsAnacondalibsubprocess.py", line 490, in run
stdout, stderr = process.communicate(input, timeout=timeout)
File "D:programsAnacondalibsubprocess.py", line 951, in communicate
stdout = self.stdout.read()
KeyboardInterrupt
Я предполагал, что это связано с размером графика, но это не так. Во-первых, он отлично работает в среде IDE minizinc и дает промежуточные решения в первые секунды. Во-вторых, ожидается некоторое время ошибок или ошибок памяти в случае большого размера, в то время KeyboardInterrupt
как это сбивает с толку. Как я могу решить эту проблему?
Комментарии:
1. Сигнализирует ли это о прерывании в установленный срок?
2. @Алекс, нет, это не так
3. Тогда, пробовали ли вы читать в цикле с
run.stdout.readline()
помощью ?, может быть, буфер ввода-вывода становится слишком большим4. @Алекс, что читаешь? Результат процесса составляет 1000 чисел, он не должен быть слишком большим.
5. @Nourless Что произойдет, если вы добавите флаги
-a
MiniZinc,-s
, и-v
для отслеживания процесса MiniZinc? Это дает вам какие-нибудь подсказки?