diff --git a/pyomo/contrib/solver/solvers/knitro/base.py b/pyomo/contrib/solver/solvers/knitro/base.py index d3032947256..c2fcc1762d1 100644 --- a/pyomo/contrib/solver/solvers/knitro/base.py +++ b/pyomo/contrib/solver/solvers/knitro/base.py @@ -82,7 +82,7 @@ def solve(self, model: BlockData, **kwds) -> Results: if config.restore_variable_values_after_solve: self._save_var_values() - with capture_output(TeeStream(self._stream, *config.tee), capture_fd=False): + with capture_output(TeeStream(self._stream, *config.tee), capture_fd=True): self._solve(config, timer) if config.restore_variable_values_after_solve: diff --git a/pyomo/contrib/solver/tests/solvers/test_knitro_direct.py b/pyomo/contrib/solver/tests/solvers/test_knitro_direct.py index 21a93fa44c7..0d6908f8e24 100644 --- a/pyomo/contrib/solver/tests/solvers/test_knitro_direct.py +++ b/pyomo/contrib/solver/tests/solvers/test_knitro_direct.py @@ -9,6 +9,9 @@ # This software is distributed under the 3-clause BSD License. # ___________________________________________________________________________ +import io +from contextlib import redirect_stdout + import pyomo.common.unittest as unittest from pyomo.contrib.solver.solvers.knitro.config import KnitroConfig @@ -87,6 +90,32 @@ class TestKnitroDirectSolver(unittest.TestCase): def setUp(self): self.opt = KnitroDirectSolver() + def test_solve_tee(self): + m = pyo.ConcreteModel() + m.x = pyo.Var(initialize=1.5, bounds=(-5, 5)) + m.y = pyo.Var(initialize=1.5, bounds=(-5, 5)) + m.obj = pyo.Objective( + expr=(1.0 - m.x) + 100.0 * (m.y - m.x), sense=pyo.minimize + ) + stream = io.StringIO() + with redirect_stdout(stream): + self.opt.solve(m, tee=True) + output = stream.getvalue() + self.assertTrue(bool(output.strip())) + + def test_solve_no_tee(self): + m = pyo.ConcreteModel() + m.x = pyo.Var(initialize=1.5, bounds=(-5, 5)) + m.y = pyo.Var(initialize=1.5, bounds=(-5, 5)) + m.obj = pyo.Objective( + expr=(1.0 - m.x) + 100.0 * (m.y - m.x), sense=pyo.minimize + ) + stream = io.StringIO() + with redirect_stdout(stream): + self.opt.solve(m, tee=False) + output = stream.getvalue() + self.assertFalse(bool(output.strip())) + def test_solve(self): m = pyo.ConcreteModel() m.x = pyo.Var(initialize=1.5, bounds=(-5, 5))