Запуск minizinc с python с ограничением по времени приводит к прерыванию работы клавиатуры

#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? Это дает вам какие-нибудь подсказки?