QProcess.start() is deprecated, what are the alternatives?

Update how you launch subprocesses with arguments in PyQt5 & PySide2
Heads up! You've already completed this tutorial.

A reader wrote in with an interesting problem when trying to launch an external script using QProcess in PyQt5/PySide2.

When trying to launch another script in a sub-process I got the error: QProcess.start(const QString & command, QFlags<QIODevice::OpenModeFlag> mode) is deprecated. Having checked the documentation it mentioned .start() was obsolete but did not suggest replacement. Do you have any suggestions.

Why is QProcess.start() showing a deprecation warning?

The confusion here comes from the .start() method being overloaded — it can be called with different signatures (collections of arguments). The .start() method itself is not removed or deprecated, just the specific signature where .start() is called with a single string containing the program and arguments together.

Deprecated members for QProcess List of deprecated methods for QProcess: note that only this signature for .start is deprecated

How to fix the deprecated QProcess.start() call

In the new API you need to set the program and arguments separately, with the latter passed as a list of strings — one item per argument. This approach is less prone to errors since it's explicit what each value you're passing actually represents.

Old approach (deprecated single-string signature)

python
p = QProcess()
p.start("python dummy_script.py")

New approach using setProgram() and setArguments()

python
p = QProcess()
p.setProgram("python")
p.setArguments(['dummy_script.py'])
p.start()

By using setProgram() and setArguments() separately, you avoid the deprecated single-string signature and make your subprocess calls clearer and more maintainable.

Alternative: pass program and arguments directly to start()

You can also pass the program and arguments as separate parameters directly to .start(), which is the non-deprecated overload:

python
p = QProcess()
p.start("python", ['dummy_script.py'])

This achieves the same result as the setProgram()/setArguments() approach, but in a single line. Both methods are valid — choose whichever is clearest for your use case.

Summary

The QProcess.start() method is not fully deprecated in PyQt5 or PySide2. Only the single-string overload that combines the program name and arguments into one string is deprecated. To fix the warning, separate the program from its arguments by using either setProgram() and setArguments() before calling .start(), or by passing them as distinct parameters to .start("python", ['dummy_script.py']).

The book has been updated with this new style API.

Well done, you've finished this tutorial! Mark As Complete
[[ user.completed.length ]] completed [[ user.streak+1 ]] day streak

Bring Your PyQt/PySide Application to Market

Stuck in development hell? I'll help you get your project focused, finished and released. Benefit from years of practical experience releasing software with Python.

Find out More

Martin Fitzpatrick

QProcess.start() is deprecated, what are the alternatives? was written by Martin Fitzpatrick.

Martin Fitzpatrick has been developing Python/Qt apps for 8 years. Building desktop applications to make data-analysis tools more user-friendly, Python was the obvious choice. Starting with Tk, later moving to wxWidgets and finally adopting PyQt. Martin founded PythonGUIs to provide easy to follow GUI programming tutorials to the Python community. He has written a number of popular Python books on the subject.