The combination of installing Python 3.7 on RasPi and removing the StringIO() cures the error.

I now get the statistics and the 'have a nice day' output from omxplayer.

I just need to find out how to invoke the idle 3.7, rather than idle 3.5, but I think that is a question for the RasPi forum.

Thank you.

Dave

On 03/12/2018 16:27, Mats Wichmann wrote:
On 12/2/18 3:29 AM, Dave Hill wrote:

Having 'graduated' to Python 3.7, I thought I would explore
subprocess.Popen, and put the code in a Class, see code below. The video
runs, but an error occurs, which I do not understand, see further below
the error happens in the except clause of your try block ...

Traceback (most recent call last):
...
   File "/home/pi/Code/VideoPlayer.py", line 51, in playVideo
     out = omxp.communicate()
...
   File "/usr/lib/python3.5/selectors.py", line 39, in _fileobj_to_fd
     "{!r}".format(fileobj)) from None
ValueError: Invalid file object: <_io.BufferedReader name=8>
You can see that the call to communicate() is the one without arguments,
so it's in your cleanup code.   You should catch the specific exception
you expect could happen here, which is probably a timeout - but you
can't tell because you don't specify it.

         try:
             out = omxp.communicate(timeout=self.timeout)
             print("Try outs =  ", StringIO(out))
         except:
             omxp.kill()
             out = omxp.communicate()
             print("Except outs =  ", StringIO(out))
use

       except TimeoutExpired:

then it looks like the file descriptor for the second communicate is no
longer valid... here's a larger chunk from subprocess that shows what it
is raising and how it got there:

     if isinstance(fileobj, int):
         fd = fileobj
     else:
         try:
             fd = int(fileobj.fileno())
         except (AttributeError, TypeError, ValueError):
             raise ValueError("Invalid file object: "
                              "{!r}".format(fileobj)) from None


In other words, it's raising the ValueError you see  because it's not a
file object. The "from None" part suppresses the context from the
original exception.

Note that communicate returns a tuple so your 'out' is actually a tuple,
and this is likely what is going wrong - by calling StringIO(out) in the
try: you are causing an exception which isn't the exception one would
expect; by not being explicit in your except: you catch that error and
take cleanup steps that are not appropriate - your video probably
finished normally.

hopefully this will help debug things...

_______________________________________________
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
https://mail.python.org/mailman/listinfo/tutor
_______________________________________________
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
https://mail.python.org/mailman/listinfo/tutor

Reply via email to