Segmentation Fault With QProcess Manager

Heads up! You've already completed this tutorial.

Ren-Hsien_Hsu | 2021-01-16 04:21:25 UTC | #1

Hello, I tried to play with the qprocess_manager, but I've been getting TypeError:

Traceback (most recent call last): File "~Document/tmp/concurrent/qprocess_manager.py", line 121, in return lambda args: target(job_id, args) TypeError: done() missing 1 required positional argument: 'exit_status'

After I removed 'exit_status' from 'done' function, it seemed to execute fine, but then the program kept crashing and returned 'Segmentation fault'. wonder if it's possible to avoid this from happening :(

Thanks so much

Ren


martin | 2021-01-21 15:36:08 UTC | #2

Create GUI Applications with Python & Qt5 by Martin Fitzpatrick — (PyQt5 Edition) The hands-on guide to making apps with Python — Over 10,000 copies sold!

More info Get the book

Hi @Ren-Hsien_Hsu welcome to the forum!

The first error is actually a bit weird, since we attach it to the finished signal, it should be receiving the exit status, see https://doc.qt.io/qt-5/qprocess.html#finished

First, does your done method have the first self parameter? Since it's an object method, it needs this to receive the object.

python
    def done(self, job_id, exit_code, exit_status):
        """
        Task/worker complete. Remove it from the active workers
        dictionary. We leave it in worker_state, as this is used to
        to display past/complete workers too.
        """
        del self._jobs[job_id]
        self.layoutChanged.emit()

If it does then we've got something weird going on. I'd try creating another method on your class...

python
def dump(self, *args):
    print(args)

...to print out everything that is being sent to the done method. You can then hook it up e.g.

python
p.finished.connect(fwd_signal(self.dump))

(remove the connection to self.done temporarily or it might crash before we see the print. When run there should be 3 variables, the job_id, the exit code, and exit status. Can you post here what you see -- and also any changes to the code -- should be possible to debug what's going on from that.

The segmentation fault is even weirder, perhaps you're ending up with a reference to a destroyed object in your job table (job_id is pointing to something it shouldn't be).


Ren-Hsien_Hsu | 2021-01-24 14:48:18 UTC | #3

Hey Marin, Thanks so much for your reply!! I didn't change the code at all, just simply run it sample one.

Here are the output from piping finished to dump ('ce89ff6113c940d98c78e8a4392eb365', 0) ('8285dc34ff4546e8a1898799aa53978e', 0) ('8202ec8824fb460bb1993c036c8f8497', 0) ('2c3af20c5c8c4bbdb2648aef337dbde4', 0)

it seems to be the uuid and the exit_status, somehow the exit_code didn't come thought :thinking:


martin | 2021-01-28 12:20:39 UTC | #4

That's weird, but there can be differences in what signals emit between PyQt5/PySide2 (and sometimes different versions of each). Can you let me know which version you're using?

Since it's not sending the exit_code through, what happens if you remove that parameter from the handler? e.g.

python
def done(self, job_id, exit_status):

Since there is nothing in that method that depends on either parameter, you can also discard them by assigning to *args, e.g.

python
def done(self, job_id, *args):

This will work no matter how many values are sent through.


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

Segmentation Fault With QProcess Manager 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.