Debian Debian-France Debian-Facile Debian-fr.org Forum-Debian.fr Debian ? Communautés

Debian-facile

Bienvenue sur Debian-Facile, site d'aide pour les nouveaux utilisateurs de Debian.

Vous n'êtes pas identifié(e).

#1 31-01-2022 12:41:45

cyrille
CA Debian-Facile
Lieu : Nowhere
Distrib. : SID + FreeBSD. Stable sur serveurs.
(G)UI : Xfce/Openbox
Inscription : 21-06-2020
Site Web

[RESOLU] python3 PIL debian SID

Bonjour

J'utilise PIL pour générer des images avec python

Par contre une mise jour semble avoir apportée une version de PIL bugguée (ce qui semble confirmé par les moteurs de recherches)

Par exemple


from PIL import Image, ImageDraw

im = Image.new("RGB", (400, 400))

draw = ImageDraw.Draw(im)

draw.rectangle((200, 100, 300, 200), fill=(0, 192, 192), outline=(255, 255, 255))

im.show()



Me retourne
pil-error.png

Si je mets imagemagick en visualiseur d'images , j'ai cette erreur , un peu plus causante

 display-im6.q16: unable to open image `/tmp/tmpy4pflfra.PNG': Aucun fichier ou dossier de ce type @ error/blob.c/OpenBlob/2924.




Il semble que le fichier temporaire n'a pas le temps d'être affiché. Soit non créé, soit  détruit avant sa lecture car rien n'apparait et rien dans /tmp

Sous DEBIAN Stable pas de soucis (ai fait des tests dans une vbox... mais pas pratique comme solution)

Quelqu'un serait il confronté au même soucis et aurait il su le régler ?

(PS ai essayé  les solutions qu'on trouve sur le web, mais déjà elles sont assez peu nombreuses et ne fonctionnent pas)

D'avance merci wink

Dernière modification par cyrille (31-01-2022 16:38:37)


"Ils ne me comprennent point, je ne suis pas la bouche qu’il faut à ces oreilles."

Association Debian-Facile | Les cahiers du débutant | ISO Debian-FacilePage perso. sur #df

Hors ligne

#2 31-01-2022 14:26:45

ubub
Membre
Distrib. : Debian
(G)UI : xfce
Inscription : 14-05-2019

Re : [RESOLU] python3 PIL debian SID

Bonjour,
j'utilise pas PIL (je l'écoute juste) ni python, mais j'ai remarqué des paquets python épinglés cause de bug depuis un moment, genre celui-là :

libpython3.10-stdlib


peut-être python 3.10 qui te pose problème ...

ah beh y'a aussi ceux-là:

python3-matplotlib python3-numpy

Dernière modification par ubub (31-01-2022 14:29:51)

Hors ligne

#3 31-01-2022 14:34:21

cyrille
CA Debian-Facile
Lieu : Nowhere
Distrib. : SID + FreeBSD. Stable sur serveurs.
(G)UI : Xfce/Openbox
Inscription : 21-06-2020
Site Web

Re : [RESOLU] python3 PIL debian SID

peut-être python 3.10 qui te pose problème ...


Je ne pense pas je suis encore sous 3.9

python3
Python 3.9.10 (main, Jan 16 2022, 17:12:18)
[GCC 11.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.




Pas mieux sous python 3.8

Mais merci wink

(PS : je préfère quand même le J Rotten des Sex Pistols que PIL wink, enfin celui des 77 , l'actuel étant bien profité -à tout point de vue wink)

Dernière modification par cyrille (31-01-2022 14:34:37)


"Ils ne me comprennent point, je ne suis pas la bouche qu’il faut à ces oreilles."

Association Debian-Facile | Les cahiers du débutant | ISO Debian-FacilePage perso. sur #df

Hors ligne

#4 31-01-2022 15:21:30

David5647
Membre
Distrib. : Debian Sid
Noyau : 5.15.0-2-amd64
(G)UI : i3wm + des bouts de kde
Inscription : 27-08-2017

Re : [RESOLU] python3 PIL debian SID

J'ai pas de solution miracle à proposer, mais tant que le code est destiné à un usage personnel, on peut s'en sortir

Méthode de bourrin : surcharger la méthode show (testé sur sid)

import multiprocessing
import subprocess
from pathlib import Path
import os
import sys
import types
from PIL import Image, ImageDraw
import uuid

tempdir = Path('/tmp')

class Process(multiprocessing.Process):
    """Classe pour ouvrir l'image dans un processus en parallele"""

    def __init__(self, img):
        super(Process, self).__init__()
        self.img = img

    def run(self):

        print("Ouverture de l'image")
        # generation d'un nom aléatoire
        tempfile = tempdir / (uuid.uuid4().hex + ".png")
        # sauvegarde dans le dossier tempdir
        self.img.save(tempfile)
        # Ouverture avec xdg-open
        p = subprocess.Popen(["xdg-open", tempfile], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        # attends la fin du process
        p.communicate()
        # détruit le fichier
        os.remove(tempfile)
        print("Fermeture de l'image")

class MyImage:
    """Classe pour surcharger la méthode show"""

    @staticmethod
    def new(*args, **kwargs):

        img = Image.new(*args, **kwargs)

        # On lie la méthode MyImage.show à l'objet img
        img.show = img.test = types.MethodType(MyImage.show, img)

        return img

    @staticmethod
    def show(im):
        print("appel img.show()")
        p1 = Process(im)
        p1.start()
        print("quitte img.show()")


im = MyImage.new('RGB', (400,400))
draw = ImageDraw.Draw(im)
draw.rectangle((200, 100, 300, 200), fill=(0, 192, 192), outline=(255, 255, 255))
im.show()
 

Hors ligne

#5 31-01-2022 15:27:40

cyrille
CA Debian-Facile
Lieu : Nowhere
Distrib. : SID + FreeBSD. Stable sur serveurs.
(G)UI : Xfce/Openbox
Inscription : 21-06-2020
Site Web

Re : [RESOLU] python3 PIL debian SID

OK merci pour l'info. Je vais faire avec ça en attendant la résolution du bug.

"Ils ne me comprennent point, je ne suis pas la bouche qu’il faut à ces oreilles."

Association Debian-Facile | Les cahiers du débutant | ISO Debian-FacilePage perso. sur #df

Hors ligne

#6 31-01-2022 16:29:23

David5647
Membre
Distrib. : Debian Sid
Noyau : 5.15.0-2-amd64
(G)UI : i3wm + des bouts de kde
Inscription : 27-08-2017

Re : [RESOLU] python3 PIL debian SID

Je suis quand même allé voir au niveau du code.
C'est peut-être de coté d'xdg-open que vient le problème???? Son fonctionnement à t'il été changé? met t'il plus de temps à se lancer?
L'image est bien supprimée avant qu'elle puisse être ouverte

Dans le fichier /usr/lib/python3/dist-packages/PIL/ImageShow.py

class UnixViewer(Viewer):
    format = "PNG"
    options = {"compress_level": 1}

    def get_command(self, file, **options):
        command = self.get_command_ex(file, **options)[0]
        return f"({command} {quote(file)}; rm -f {quote(file)})&"

    def show_file(self, file, **options):
        """Display given file"""
        fd, path = tempfile.mkstemp()
        with os.fdopen(fd, "w") as f:
            f.write(file)
        with open(path) as f:
            command = self.get_command_ex(file, **options)[0]
            subprocess.Popen(
                ["im=$(cat);" + command + " $im; rm -f $im"], shell=True, stdin=f
            )
        os.remove(path)
        return 1



L'insertion d'un sleep 1 semble fonctionner chez moi

            subprocess.Popen(
                ["im=$(cat);" + command + " $im; sleep 1; rm -f $im"], shell=True, stdin=f
            )



Ou si je remplace

command = self.get_command_ex(file, **options)[0]

(qui donne xdg-open) par

command = "gwenview"

L'image est correctement affichée, alors même que c'est bien gwenview qui est ouvert dans les deux cas.

Dernière modification par David5647 (31-01-2022 16:32:59)

Hors ligne

#7 31-01-2022 16:38:04

cyrille
CA Debian-Facile
Lieu : Nowhere
Distrib. : SID + FreeBSD. Stable sur serveurs.
(G)UI : Xfce/Openbox
Inscription : 21-06-2020
Site Web

Re : [RESOLU] python3 PIL debian SID

Très intéressant, je me penche sur ce point (sleep).
Merci beaucoup (dans mes tests, je ne l'avais pas inséré correctement semble t il )
Un grand merci

"Ils ne me comprennent point, je ne suis pas la bouche qu’il faut à ces oreilles."

Association Debian-Facile | Les cahiers du débutant | ISO Debian-FacilePage perso. sur #df

Hors ligne

#8 31-01-2022 17:05:13

David5647
Membre
Distrib. : Debian Sid
Noyau : 5.15.0-2-amd64
(G)UI : i3wm + des bouts de kde
Inscription : 27-08-2017

Re : [RESOLU] python3 PIL debian SID

Si tu veux laisser le code source tranquille et juste surcharger le viewer avec la fonction register


import tempfile
import subprocess
import os

from PIL import ImageShow, Image, ImageDraw

class MyViewer(ImageShow.Viewer):
    format = "PNG"
    options = {"compress_level": 1}

    def show_file(self, file, **options):
        """Display given file"""
        fd, path = tempfile.mkstemp()
        with os.fdopen(fd, "w") as f:
            f.write(file)
        with open(path) as f:
            command = "xdg-open"
            subprocess.Popen(
                ["im=$(cat);" + command + " $im; sleep 1; rm -f $im"], shell=True, stdin=f
            )
        os.remove(path)
        return 1

ImageShow.register(MyViewer, 0)

im = Image.new('RGB', (400,400))
draw = ImageDraw.Draw(im)
draw.rectangle((200, 100, 300, 200), fill=(0, 192, 192), outline=(255, 255, 255))
im.show()
 

Hors ligne

#9 31-01-2022 19:07:35

cyrille
CA Debian-Facile
Lieu : Nowhere
Distrib. : SID + FreeBSD. Stable sur serveurs.
(G)UI : Xfce/Openbox
Inscription : 21-06-2020
Site Web

Re : [RESOLU] python3 PIL debian SID

Nickel cette classe, je la garde sous le coude wink Thx a lot wink

"Ils ne me comprennent point, je ne suis pas la bouche qu’il faut à ces oreilles."

Association Debian-Facile | Les cahiers du débutant | ISO Debian-FacilePage perso. sur #df

Hors ligne

Pied de page des forums