ChatGPT n'arrive pas à m'aider sur ce coup, et vous?

Je travail a récrire une parie de mon projet RPI-QL, pour y inclure des templates.

Ce qui ne marche pas est ce que je tente de faire pour mes lignes de commandes

python rpiql.py -f "demo.rpiql" -v 'item1="demo":item2="ceci est un test de variable: trop long pour savoir non ?"'

Ce que je veux faire est que depuis cette commande, il traite -v comme tel, en gardant les guillemets et qui les séparer en valeurs, pour que si j’appel avec getValue("item1") et bien j’obtiens « demo » comme résultat.

Le problème est que l’argument, une fois passé dans le script perd les guillemets ("), et cause ainsi un problème, car mon séparateur est « : » et ce caractère peut être utilisé dans une valeur, comme pour « item2 » dans ce démo.

ChatGPT arrive a séparer les valeurs, mais est incaapable de comprendre deux demandes pour régler mon problème;

  1. Comment garder mes guillemet pour déterminer la valeur au complet, car actuellement ils son supprimé par le paste de l’argument
  2. Comment ignorer le « : » présent dans une valeur

Au mieu j’obtient le item1, mais le item2 s’arrête après variable, à cause du « : » avec la solution chatGPT (avec qui je me suis enragé à faire comprendre durant des heures ce problème).

actuellement, mon code pour les argument est ceci;

# application
argv = sys.argv[1:]
opts, args = getopt.getopt(argv,"ha:f:v:")
help=False
       
for opt, arg in opts:
    if opt == '-h':
        help=True
        print("*** Help for command parameters")
        print("\t-f\t<filepath>\t\tLoading draw file\r\n\t--file\t<filepath>")
        print("\t-v\t<id=\"value\":id=\"value\">\tReplace values of id in draw file\r\n\t--value\t<id=\"value\":id=\"value\">")
    elif opt == '-f' or opt == "--file":
        debug("*** Loading draw file " + arg)
        drawFile=arg
    elif opt == '-v' or opt == "--values":
        debug("*** Loading draw values " + arg)
        drawValues = arg
    else:
        #Determine parameters
        debug()

et drawValues retourne
item1=demo:item2=ceci est un test de variable: trop long pour savoir non ?

au lieu de
item1="demo":item2="ceci est un test de variable: trop long pour savoir non ?"

Alors comment je corrige la situation pour obtenir ça ? Sans bien sur ajouter des \ devant les " dans la ligne de commande.

Idéalement je veux pouvoir définir des paramètres id=value:id2=value2 … et pour voir aller les chercher depuis getValue(idname) .

Tu peux changer de séparateur imaginons un ; ou , et le script est en quel language ?

C’est du Python, comme la commande l’indique…

Et non, changer en « , » servira a rien, car il peut y avoir des textes… c’est pour remplacer des champs sur des étiquettes.

Explication du projet…

RPI-QL est un script qui permet de générer des étiquettes pour une Brother QL. Sous Windows, il y a le B-PAC SDK qui permet d’utiliser des templates généré avec P-Touch pour lancer des impression pré-formaté. Il est possible aussi de changer des valeurs dans le template, qui soit en texte ou en image. Mais le B-PAC n’est pas disponible sous Linux.

Alors dans la première version, j’avais codé des formats type, mais le problème est que je suis limité à c’est format et la programmation qui en découle. Il était possible de passer des valeurs, mais dans des format pré-codé.

Dans cette version, je me crée mon propre système de template, au lieu de tenter de convertir celui de P-Touch, qui est « encodé ». Le fichier dans mon exemple est « demo.rpiql ». Ce fichier contient donc les consignes pour le formatage du modèle et fournis un moyen de remplacer des valeurs.

Dans la version 2, le résultat est meilleur car le contrôle, même si passé en dans un ini, est plus flexible. Le code est pensé pour placer du texte avec certaines contraintes. Les utilisateurs pourrons facilement créer leur étiquettes sans devoir passé par du codage en python, seulement créer des modèles qui passeront au script.

Voici un exemple de modèle;

[paper]
width=464
height=212
rotate=0

[text1]
posx=1
posy=1
width=464
height=32
overflow=fit
align=center
type=text
value=Propriété de
params=

[text2]
posx=1
posy=32
width=464
height=48
overflow=fit
align=center
type=text
value=Mathieu Légaré
params=

[text3]
posx=1
posy=80
width=464
height=32
overflow=fit
align=center
type=text
value=555-555-5555
params=

[image]
posx=1
posy=1
width=48
height=48
type=image
value=logo.jpg
params=

[barcode]
posx=16
posy=112
width=432
height=100
type=barcode
value=1234567890
params=sub

Pour ce modèle, la commande à lancer est
python rpiql.py -f "demo.rpiql" -v 'barcode="0001"'

Ce qui donne
output


Alors l’application est initialement utilisé en ligne de commande, le chargement du fichier et par la suite les valeurs qui seront remplacés. J’aurais peut faire -item1 "value1" -item2 "value2" comme valeur, mais je ne sais pas comment bien l’interpréter sur la ligne de commande.

Les valeurs peuvent être un nom de fichier ou du texte. Et dans le texte, je veux laisser la place à tout les caractères, même idéalement les guillemets (") et apostrophes ('). Ce qui était un problème dans la version 1.

Je convient que même ma méthode, ici posé, n’est pas la meilleur, si vous avez mieux à proposer, je suis preneur. C’est à peu près la seul chose qui reste à compléter proprement. Mis a part mon code pour faire du « wrap » de texte si trop long (ajouter des sauts de ligne).

Bonjour,
J’ai un peu cherché, mais rien trouvé à mon niveau.
Il me semble que le problème c’est de découper le contenu de « arg » avec trop de contraintes. J’ai essayé avec « split » (« arg.split(‹ : ›,1)[x]) » mais il ne fait pas la différence avec les « : » de séparation des variables et celui dans le texte.
Éventuellement, est-il possible de mettre autant d’option -v qu’il y a d’item ?
Comme ceci :
python rpiql.py -f "demo.rpiql" -v 'item1="demo"' -v 'item2="ceci est un test de variable: trop long pour savoir non ?"'

Ensuite injecter les valeurs pour chaque « item » dans un dictionnaire:

        # Initialisation de item en dictionnaire (début du script)
        item={} => En début de script 
        # ....
        # Alimentation du dictionnaire à chaque appel de l'option -v 
        # A ajouter après ( drawValues = arg )
        item[arg.split('=',1)[0]]=arg.split('=',1)[1]

C’est sans doute pas une solution, mais cela va peut être apporter des pistes…

Bonne bidouilles.
A+

je viens de tester avec python 3.9.2 sur un raspberry, les guillemets sont bien présent !!!

pi@raspberrypi:/etc $ python test.py -f « demo.rpiql » -v ‹ item1=« demo »:item2=« ceci est un test de variable: trop long pour savoir non ? » ›
*** Loading draw file demo.rpiql
*** Loading draw values item1=« demo »:item2=« ceci est un test de variable: trop long pour savoir non ? »
pi@raspberrypi:/etc $

avec le code python suivant:

application

python test.py -f « demo.rpiql » -v ‹ item1=« demo »:item2=« ceci est un test de variable: trop long pour savoir non ? » ›

import sys
import getopt

argv = sys.argv[1:]
opts, args = getopt.getopt(argv,« ha:f:v: »)
help=False

for opt, arg in opts:
if opt == ‹ -h ›:
help=True
print(« *** Help for command parameters »)
print(« \t-f\t\t\tLoading draw file\r\n\t–file\t »)
print(« \t-v\t<id="value":id="value">\tReplace values of id in draw file\r\n\t–value\t<id="value":id="value"> »)
elif opt == ‹ -f › or opt == « –file »:
print(« *** Loading draw file " + arg)
drawFile=arg
elif opt == ‹ -v › or opt == « –values »:
print( »*** Loading draw values " + arg)
drawValues = arg
else:
print("*** Loading draw values " + arg)