Should I use `app.exec()` or `app.exec_()` in my PyQt application?

23,757

Solution 1

That's because until Python 3, exec was a reserved keyword, so the PyQt devs added underscore to it. From Python 3 onwards, exec is no longer a reserved keyword (because it is a builtin function; same situation as print), so it made sense in PyQt5 to provide a version without an underscore to be consistent with C++ docs, but keep a version with underscore for backwards compatibility. So for PyQt5 with Python 3, the two exec functions are the same. For older PyQt, only exec_() is available.

Solution 2

On the question of whether to prefer one over the other: using exec_ means you have one less thing to worry about if you ever decide to add support for PyQt4 and/or Python >= 2.6, and want to maintain a single code-base.

Solution 3

As of PyQt 6, app.exec_() is no longer supported, only app.exec() is.

Hence, when building new apps I only use the latter.

https://www.riverbankcomputing.com/static/Docs/PyQt6/pyqt5_differences.html?highlight=pyqt5

Share:
23,757
socket
Author by

socket

Updated on July 09, 2022

Comments

  • socket
    socket almost 2 years

    I use Python 3 and PyQt5. Here's my test PyQt5 program, focus on the last 2 lines:

    from PyQt5.QtCore import *
    from PyQt5.QtWidgets import *
    import sys
    
    class window(QWidget):
    def __init__(self,parent=None):
        super().__init__(parent)
        self.setWindowTitle('test')
        self.resize(250,200)
    
    app=QApplication(sys.argv)
    w=window()
    w.show()
    sys.exit(app.exec())
    #sys.exit(app.exec_())
    

    I know exec is a language keyword in Python. But code on Official PyQt5 Documentation (specifically the Object Destruction on Exit part). I see that example shows use of app.exec() which confuses me.

    When I tested it on my machine. I found there is no any visible difference from my end. Both with and without _ produces the same output in no time difference.

    My question is:

    • Is there anything wrong going when I use app.exec()? like clashing with Python's internal exec? I suspect because both exec's are executing something.
    • If not, can I use both interchangeably?
  • FeRD
    FeRD about 6 years
    I think you mean Python <= 2.99, right? (Or Python2 >= 2.6.).
  • ekhumoro
    ekhumoro about 6 years
    @FeRD. No. I mean that exec_ will work with any version of python equal to or greater than 2.6 in combination with either pyqt4 or pyqt5. Earlier versions of python are not supported by pyqt. So exec_ is both forwards and backwards compatible with both pyqt4 and pyqt5, and any version of python >= 2.6 (I doubt whether python-3.0.x is really viable, though).
  • Muslimbek Abduganiev
    Muslimbek Abduganiev almost 3 years
    PyQt6 no longer supports exec_(), now only exec() is available.
  • eri0o
    eri0o over 2 years
    but what should I do instead?
  • eric
    eric over 2 years
    I've clarified my answer. OP wanted to know whether to use app.exec() or app.exec_(). Since app.exec_() is no longer supported, I only use app.exec() in new apps. It just makes things simpler moving forward.