Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Jython : 1st arg can't be coerced to byte[]

5 réponses
Avatar
Sébastien Ramage
j'ai le probl=E8me suivant avec Jython,
j'essaie de cr=E9er une image avec ImageIcon =E0 partir d'un array of
byte, cela fonctionnait avec Jython 2.1 mais depuis que j'ai recompiler
avec les fichiers du CVS j'ai l'erreur suivante

TypeError: javax.swing.ImageIcon(): 1st arg can't be coerced to byte[],
java.awt
.Image, String or java.net.URL


Portion du code

byte =3D []
for x in stri:
byte.append(ord(x))
icon =3D swing.ImageIcon(byte)

quelqu'un a une id=E9e?

Seb

5 réponses

Avatar
kaerbuhez

j'ai le problème suivant avec Jython,
j'essaie de créer une image avec ImageIcon à partir d'un array of
byte, cela fonctionnait avec Jython 2.1 mais depuis que j'ai recompiler
avec les fichiers du CVS j'ai l'erreur suivante

TypeError: javax.swing.ImageIcon(): 1st arg can't be coerced to byte[],
java.awt
.Image, String or java.net.URL


Portion du code

byte = []
for x in stri:
byte.append(ord(x))
icon = swing.ImageIcon(byte)

quelqu'un a une idée?

Seb

Bon, j'ai pas la même version de Jython que toi mais si tu remplaces ta

portion de code par celle-ci:

byte_list = []
for x in stri:
byte_list.append(ord(x))
byte_array=jarray.array(byte_list, 'b')
icon = swing.ImageIcon(byte_list)

(j'évite aussi - à tort ou à raison - d'utiliser "byte" comme nom de
variable)

Est-ce que ça marche ? Sinon, n'hésite pas à poster le traceback complet.

Et au passage,
- est-ce difficile de recompiler la version CVS de jython ?
- est-elle raisonablement stable ?

Avatar
kaerbuhez


j'ai le problème suivant avec Jython,
j'essaie de créer une image avec ImageIcon à partir d'un array of
byte, cela fonctionnait avec Jython 2.1 mais depuis que j'ai recompiler
avec les fichiers du CVS j'ai l'erreur suivante

TypeError: javax.swing.ImageIcon(): 1st arg can't be coerced to byte[],
java.awt
.Image, String or java.net.URL


Portion du code

byte = []
for x in stri:
byte.append(ord(x))
icon = swing.ImageIcon(byte)

quelqu'un a une idée?

Seb

Bon, j'ai pas la même version de Jython que toi mais si tu remplaces ta

portion de code par celle-ci:

byte_list = []
for x in stri:
byte_list.append(ord(x))
byte_array=jarray.array(byte_list, 'b')
icon = swing.ImageIcon(byte_list)

(j'évite aussi - à tort ou à raison - d'utiliser "byte" comme nom de
variable)

Est-ce que ça marche ? Sinon, n'hésite pas à poster le traceback complet.

Et au passage,
- est-ce difficile de recompiler la version CVS de jython ?
- est-elle raisonablement stable ?

Zut, pas pu testé donc me suis planté. Version correcte (j'espère):

import jarray
byte_list = []
bytes_list=[ord(x) for x in stri]
byte_array=jarray.array(byte_list, 'b')
icon = swing.ImageIcon(byte_array)

Au passage, j'ai remplacé la boucle par une list comprehension ... et du
coup, je me demande si ton probléme n'est pas tout simplement un
probléme d'indentation (alors tu n'as pas besoin du jarray mais il ne
fait pas de mal non plus, en tout cas dans ma version).

Ce qu'il faut comprendre c'est que Jython essaie de convertir
implitement* les types python en types Java ET de trouver le bon
constructeur. Tu dois donc passer ton tableau de int python d'une
manière telle que Jython le comprenne et donc convertisse en array de
bytes java et appelle le bon constructeur.

*au passage en rompant à mon avis avec "explicit is better ..."


Avatar
Sébastien Ramage
ça fonctionne mieux (en changeant byte_list en bytes_list)

mais nouveau problème:

OverflowError: value too large for byte

pfiou...
je me demande si je ne ferais pas mieux d'apprendre le java
Avatar
kaerbuhez
ça fonctionne mieux (en changeant byte_list en bytes_list)

mais nouveau problème:

OverflowError: value too large for byte


C'est que ton ord(x) renvoie une valeur > 255 : met un print pour voir.
N'hésite pas à mettre TOUT le message d'erreur, ça aidera beaucoup à
t'aider ;-)

Ta chaine est pas en Unicode j'espère !

(Tout ça est sous réserve, comme mentionné précédemment, je ne dispose
pas de la plateforme pour tester et valider ce que je dis, désolé)


pfiou...
je me demande si je ne ferais pas mieux d'apprendre le java

C'est à mon avis LE point faible* de Jython : une connaissance de Java

est beaucoup plus utile (voire nécessaire ?) que ne l'est la
connaissance de C pour CPython. Y a qu'à regarder les livres Jython, ils
sont tous destinés aux programeurs Java voulant scripter en Python
plutôt qu'aux developpeurs python voulant accéder à la plate-forme Java.
N'empeche, une fois qu'on domine Jython, c'est à mon avis un plus
indéniable sur cette plate-forme.

*ce point faible est le revers de la médaille de la grande force de
Jython (son point fort par rapport à CPython si on veut) : sa plus
grande intégration avec la plateforme sous-jacente. Il suffit de voir
comme il est simple - voire trivial - de faire des "extensions" Java
pour Jython.

Avatar
Sébastien Ramage
finalement je laisse tomber, je vais patienter un peu et apprendre le
java à temps perdu.

je réponds à ta question, il est très facile de recompiler Jython en
utilisant ant
il suffit de créer un fichier ant.properties sur le modèle donné
dans un des fichier texte du CVS (je ne sais plus lequel)
et ensuite ant fait le travail avec le fichier build.xml

Attention, la version du CVS est actuellement 2.2a1 donc il faut avoir
Python 2.2.x pour récupérer le contenu du répertoire Lib pour Jython

Pour la stabilité, je n'ai pas vraimment eu le temps de tester mais ce
que je peux dire c'est que cette version corrige de nombreux problème
de Jython 2.1 (notamment pour une utilisation avec Java 1.5)

merci de ton aide
Seb