Bug related to importing sequence with PyQt5 and ortools Python
- Dominant language
- C++
- Stars
- 14.1k
- Forks
- 2.5k
- Avg merge
- 8h 39m
- Merged PRs (30d)
- 72
Description
**What version of OR-Tools and what language are you using?**
Version: 9.14.6206.
Language: Python
**Which solver are you using (e.g. CP-SAT, Routing Solver, GLOP, BOP, Gurobi)**
CP-SAT
**What operating system (Linux, Windows, ...) and version?**
Microsoft Windows 11
**What did you do?**
Steps to reproduce the behavior:
1. Produce two python file, A.py and L.py
A.py:
```Python from ortools.sat.python import cp_model
def a():
"""Simple CP model solving example"""
print("Starting to solve...")
# Create model
model = cp_model.CpModel()
# Create variables
x = model.NewIntVar(0, 10, 'x')
y = model.NewIntVar(0, 10, 'y')
# Add constraints
model.Add(x + y == 10)
model.Add(x - y >= 2)
# Set objective function
model.Maximize(x + 2 * y)
# Solve
print("Solver")
solver = cp_model.CpSolver()
print("Solving...")
status = solver.Solve(model)
if status == cp_model.OPTIMAL:
print(f"Solved successfully: x = {solver.Value(x)}, y = {solver.Value(y)}")
print(f"Objective value: {solver.ObjectiveValue()}")
else:
print("Solving failed")
return status == cp_model.OPTIMAL
if __name__ == "__main__":
a()
```
L.py:
```Python # import A # ①Import order that won't cause bugs: import A first, then PyQt5
# Bug-causing way: import PyQt5 first, then A
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QVBoxLayout, QWidget
import sys
import A # ②This will cause issues - unless A is imported before PyQt5
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("Test Window")
self.setGeometry(100, 100, 300, 200)
central_widget = QWidget()
self.setCentralWidget(central_widget)
layout = QVBoxLayout()
self.solve_button = QPushButton("Run Solver")
self.solve_button.clicked.connect(self.run_solver)
layout.addWidget(self.solve_button)
central_widget.setLayout(layout)
def run_solver(self):
print("Solver button clicked")
try:
# Call function from A file
success = A.a()
if success:
print("Solver completed!")
else:
print("Solver failed!")
except Exception as e:
print(f"Error during solving: {e}")
if __name__ == '__main__':
# Run solver once
print("Calling solver function a...")
try:
A.a()
except Exception as e:
print(f"Automatic solving failed: {e}")
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())
```
2. Change the "import A" position at the beginning of L.py, and run L.py once each.
3. See the result
**What did you expect to see**
Runing L.py with the proper import sequence
```python
import A # ①Import order that won't cause bugs: import A first, then PyQt5
# Bug-causing way: import PyQt5 first, then A
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QVBoxLayout, QWidget
import sys
# import A # ②This will cause issues - unless A is imported before PyQt5
```
and click the "Run Solver" PyQt5 UI button once, the terminal will display such result:
```
Calling solver function a...
Starting to solve...
Solver
Solving...
Solved successfully: x = 6, y = 4
Objective value: 14.0
Solver button clicked
Starting to solve...
Solver
Solver
Solver
Solving...
Solved successfully: x = 6, y = 4
Objective value: 14.0
Solver completed!
```
**What did you see instead?**
Runing L.py with the improper import sequence:
```python
# import A # ①Import order that won't cause bugs: import A first, then PyQt5
# Bug-causing way: import PyQt5 first, then A
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QVBoxLayout, QWidget
import sys
import A # ②This will cause issues - unless A is imported before PyQt5
```
The terminal will print
```
Calling solver function a...
Starting to solve...
Solver
Solving...
```
and then just quit without result solved, Qt UI appeared or error raised.
Make sure you include information that can help us debug (full error message, model Proto).
**Anything else we should know about your project / environment**
```
PyQt5 5.15.11
PyQt5-Qt5 5.15.2
PyQt5_sip 12.17.1
```
Contributor guide
Assessment
This issue has not been assessed yet.