Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 27/01/2023, à 18:35

Hizoka

[Résolu] Réccupérer une variable liste bash depuis python

Bonsoir,

je me galère sur un truc et du coup, je viens vers vous à la recherche d'idée.

J'ai,
1 fichier bash qui contient en autre :

Includes=("FolderImage.sh" "Matroska.sh")

1 fichier python qui lit ce fichier bash pour l'afficher et je voudrais convertir cette liste bash en array python.
Voyez vous un moyen de faire ça proprement ?

J'ai essayé de déclarer la variable via subprocess pour la récupérer mais sans succès.
Après, je peux essayer de décortiquer le texte,
  en virant Includes=( puis )
  essayer de voir si les éléments sont entourés de " ou de ' ou de rien...
  puis lire les éléments et les ajouter dans un array
mais ça parait super complexe...

Je ne veux pas exécuter le fichier bash dans python.

Auriez vous des idées pour me dépanner ?
Merci

EDIT,
Je suis en train de partir sur un truc du genre :

subprocess.getstatusoutput("""/bin/bash -c 'Includes=("FolderImage.sh" "Matroska.sh"); (IFS='@'; echo "${Includes[*]}")'""")
(0, 'FolderImage.sh@Matroska.sh')

Puis de faire un split sur le résultat pour créer un array.

Dernière modification par Hizoka (Le 29/01/2023, à 15:17)


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#2 Le 27/01/2023, à 18:55

Watael

Re : [Résolu] Réccupérer une variable liste bash depuis python

pourquoi ?
pourquoi 2 fichiers ?
pourquoi le python doit-il avaler le bash pour digérer sa variable ?

Dernière modification par Watael (Le 27/01/2023, à 18:56)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#3 Le 27/01/2023, à 18:59

Hizoka

Re : [Résolu] Réccupérer une variable liste bash depuis python

L'idée, comme indiquée, est que le soft python (pyqt) affiche le code bash dans un QPlainText et au passage récupère cette variable.

Les 2 fichiers sont 2 soft différents.


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#4 Le 27/01/2023, à 19:06

iznobe

Re : [Résolu] Réccupérer une variable liste bash depuis python

Salut , le contenu des fichiers se presente sous quelle forme ?
un chemin par ligne ?

EDIT : je n' avais pas vu ta reponse precedente . trop compliqué pour moi .

En fait tu cherches a executer des scripts bash a partir de python , puis a creer un tableau  des valeurs , demander a python de lancer un script je sais faire .
mais je pense pas qu ' il soit possible de recuperer les valeurs sans passer par un intermediaire , comme ecrire dans un fichier texte le retour des scripts avant de les traiter , en tout cas ça , je ne sais pas faire .

Dernière modification par iznobe (Le 27/01/2023, à 19:12)


retour utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .

Hors ligne

#5 Le 27/01/2023, à 19:09

Hizoka

Re : [Résolu] Réccupérer une variable liste bash depuis python

Pas compris, c'est un bash de type :

#!/bin/bash

InputFile="$1"
InputMimeType="$2"
ThumbPath="$3"
ThumbName="${ThumbPath##*/}"

Includes=("FolderImage.sh" "Matroska.sh")

[[ -e "${HOME}/.cache/thumbnails/large/${ThumbName}.png" || -e "${HOME}/.cache/thumbnails/normal/${ThumbName}.png" ]] && exit 1

bla bla bla

Dernière modification par Hizoka (Le 27/01/2023, à 19:09)


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#6 Le 27/01/2023, à 19:16

iznobe

Re : [Résolu] Réccupérer une variable liste bash depuis python

tu desires afficher le texte de ton script  ? ca c' est plutot simple voir par exemple : https://python.doctor/page-lire-ecrire- … ier-python
que ce soit un script bash ou pas , ca ne change rien . ca reste un fichier texte pour python .


pourquoi ne pas decomposer chaque etape de ce que tu desires faire plutot que de faire un " truc " qui cumule tout en le moins de caracteres possible , le moins de mots et le moins de ligne possible tongue ?

Au depart , tu decomposes en chaque action , tu definis quel langage est le plus approprié pour chaque action au moins , puis tu condenses au fur et a mesure quand c' est possible .

pas grave si ca prend 10 lignes au lieu de 2 . A moins que tu sois a court d' espace disque tongue

Dernière modification par iznobe (Le 27/01/2023, à 19:23)


retour utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .

Hors ligne

#7 Le 27/01/2023, à 20:01

Hizoka

Re : [Résolu] Réccupérer une variable liste bash depuis python

Je n'ai aucun souci pour afficher le contenu du script bash.

Que ce soit fait lors de l'affichage du code ou non m'importe peu.

Tout ce que je veux c'est récupérer une liste bash dans un array python.

Chose que j'arrive à faire via :

subprocess.getstatusoutput("""/bin/bash -c 'Includes=("FolderImage.sh" "Matroska.sh"); IFS='@'; echo "${Includes[*]}"'""")[1].split("@")
['FolderImage.sh', 'Matroska.sh']

Lorsque j'ai lancé la conversation, je n'avais trouvé aucune solution, j'ai celle ci pour le moment mais il y a sûrement plus propre ou simple.

Dernière modification par Hizoka (Le 27/01/2023, à 20:02)


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#8 Le 27/01/2023, à 20:41

kamaris

Re : [Résolu] Réccupérer une variable liste bash depuis python

Hors ligne

#9 Le 28/01/2023, à 06:47

Compte supprimé

Re : [Résolu] Réccupérer une variable liste bash depuis python

Bonjour,
En full python, j'utiliserai une expression rationnelle afin de trouver et extraire un truc dans du texte (ton script bash) ou bien je ferais un traitement manuel (if "Includes:" in ligne:    patatipatata)
Pour l'approche avec une expression rationnelle, ça pourrait ressembler à:

import re
with open('bash.sh') as f:
    for ligne in f:
        pattern = r'^Includes=\(\"(\w*\.sh)\" \"(\w*\.sh)"'
        match = re.match(pattern, ligne)
        if match:
            print([match.group(1), match.group(2)])

note:  Le pattern est pour un tableau à 2 éléments. Si le nombre d'éléments n'est pas défini, il faut en concevoir un autre ...

#10 Le 28/01/2023, à 10:49

Nuliel

Re : [Résolu] Réccupérer une variable liste bash depuis python

Hello,
Comme MPython Alaplancha, Je pense effectivement que les expressions régulières sont le plus adapté à ton problème vu que j'ai l'impression que tu souhaites conserver le Includes dans le fichier bash (même si le titre donne envie de répondre variables d'environnement). On peut tout à fait faire avec une regex pour un tableau à plus de deux éléments. Ça devrait ressembler à un truc dans ce genre

import re

with open('bash.sh') as f:
    for ligne in f:
        pattern = r'^Includes=\((?:\"(.+\.sh)\"\s?)+\)'
        match = re.match(pattern, ligne)
        print(match.groups())

Ça marche pas totalement, ça me sort

('FolderImage.sh" "Matroska.sh" "truc.sh',)

mais c'est dans l'idée.

Dernière modification par Nuliel (Le 28/01/2023, à 10:50)

Hors ligne

#11 Le 28/01/2023, à 11:55

Hizoka

Re : [Résolu] Réccupérer une variable liste bash depuis python

@MPython Alaplancha et @Nuliel
C'était en effet une idée que j'avais mais c'est très aléatoire je trouve car :

Includes=("FolderImage.sh" "Matroska.sh")
Includes=("FolderImage.sh" Matroska.sh)
Includes=("FolderImage.sh" 'Matroska.sh')

Tout est valide en bash mais ça complique énormément la re...
Et comme demandé, le nombre est inconnu.

@kamaris
J'ai trouvé pas mal de choses qui partent d'un script bash qui :
- fait un export de la variable
- lance le script python avec un argument
Mais moi, je ne pars pas d'un bash justement et je ne veux pas l’exécuter car il fait d'autres trucs.

J'ai également essayé de faire un export de variable dans le subprocess mais impossible de récupérer derrière.

Au final,

line = 'Includes=("FolderImage.sh" "Matroska.sh")'

# Vérifie que le @ est dispo
if "@" not in line:
  separateur = "@"
#...
subprocess.getstatusoutput("""/bin/bash -c '""" + line + """; IFS='@'; echo "${Includes[*]}"'""")[1].split(separateur)
['FolderImage.sh', 'Matroska.sh']

Fonctionne quelque soit le format de l'array bash, avec ou sans " / '.

Mais il est vrai que j'aurais aimé un truc full python.
Je pense que je vais rester sur un truc du genre...

Merci à vous !

Dernière modification par Hizoka (Le 28/01/2023, à 11:56)


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#12 Le 28/01/2023, à 14:31

Compte supprimé

Re : [Résolu] Réccupérer une variable liste bash depuis python

Hizoka a écrit :

Mais il est vrai que j'aurais aimé un truc full python.
Je pense que je vais rester sur un truc du genre...

Selon quoi, ça peut prendre du temps pour concevoir un pattern qui match avec toutes les situations que l'on peut rencontrer.
Pour ma part, j'utilise https://regex101.com/ pour élaborer le pattern.
Si tu souhaites te familiariser avec les regex ---> https://regexone.com/lesson/introduction_abcs

Je peux m'y atteler si tu veux, mais je doute que cela t'apporte quelque chose: Je pense qu'il est plus facile d'écrire une regex que de la lire roll

Message édité

Dernière modification par Compte supprimé (Le 28/01/2023, à 18:37)

#13 Le 28/01/2023, à 15:14

Compte supprimé

Re : [Résolu] Réccupérer une variable liste bash depuis python

Sinon sans regex:
Fichier bash.sh:

et
ffffff
Includes=( "yop.sh"    "truc.sh" 'yep.sh'     )
gggg
patati
patata

Code python:

with open('bash.sh') as f:
    for ligne in f:
        if "Includes" in ligne:
            for pattern in ('Includes=', '(', ')', '"', "'",):
                ligne = ligne.replace(pattern, "")
            print(ligne.split())

retour:

['yop.sh', 'truc.sh', 'yep.sh']

Dernière modification par Compte supprimé (Le 28/01/2023, à 15:15)

#14 Le 28/01/2023, à 19:18

diesel

Re : [Résolu] Réccupérer une variable liste bash depuis python

Hizoka a écrit :

Mais moi, je ne pars pas d'un bash justement et je ne veux pas l’exécuter car il fait d'autres trucs.

J'ai du mal à comprendre ce que tu veux faire.

Une variable bash (et a fortiori son contenu), ça n'existe que dans un bash qui tourne. Alors, quand tu dis que tu ne veux pas lancer ton script, j'ai beaucoup de mal à voir comment tu vas récupérer quelque chose. Sauf à enregistrer lors de la dernière exécution de ton script bash le contenu de ta variable dans un fichier qu'il suffit de relire en python ou à exporter ta variable dans un bash parent lors de la dernière exécution de ton script et qui tourne toujours (le bash parent) lors de l'exécution de ton script python.

Amicalement.

Jean-Marie.


Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.

Hors ligne

#15 Le 29/01/2023, à 10:38

Tawal

Re : [Résolu] Réccupérer une variable liste bash depuis python

Hello,

Je ne connais rien à python (je préviens).

Mais j'ai quand même du mal à saisir la demande.
Ce que j'en comprends :
Le fichier bash doit être lu par le script python (pour affichage) et durant dette lecture,
détecter la présence d'une affectation d'une certaine variable (Includes),
récupérer la valeur de cette variable dans le script python (pour traitement ultérieur).

Si c'est bien cela, alors les réponses de Nuliel et de MPython Alaplancha sont judicieuses amha.

Dernière modification par Tawal (Le 29/01/2023, à 10:38)


Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !

Hors ligne

#16 Le 29/01/2023, à 14:20

Hizoka

Re : [Résolu] Réccupérer une variable liste bash depuis python

@Tawal
C'est totalement ça.

@diesel

Une variable bash (et a fortiori son contenu), ça n'existe que dans un bash qui tourne.

Sa valeur est en dur dans le code et c'est ça que je veux.

@MPython Alaplancha
Super idée !
J'ai modifié le code car les valeurs ne peuvent pas avoir d'espaces ni de ' dans leur nom.
Du coup, j'en suis arrivé à ça :

if "Includes=" == ligne[:9]: 
    for pattern in ('Includes=', '("', "('", '")', "')", ")", "("):
        ligne = ligne.replace(pattern, "")
        
    for pattern in ("' ", '" ', " '", ' "', "@@@'", "'@@@", '@@@"', '@@@"'):
        ligne = ligne.replace(pattern, "@@@")
        
    print(ligne.split("@@@"))

ce qui donne :

ligne="""Includes=("Folder Image.sh" "Matro'ska.sh" 'oui oui.sh' nonnon.sh)"""
# ['Folder Image.sh', "Matro'ska.sh", 'oui oui.sh', 'nonnon.sh']

ligne="""Includes=(FolderImage.sh "Matro'ska.sh" 'oui oui.sh' 'nonnon.sh')"""
['FolderImage.sh', "Matro'ska.sh", 'oui oui.sh', 'nonnon.sh']

ligne="""Includes=(FolderImage.sh "Matro'ska.sh" 'oui"oui.sh' nonnon.sh)"""
# ['FolderImage.sh', "Matro'ska.sh", 'oui"oui.sh', 'nonnon.sh']

Ca me semble parfait smile

Merci !


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#17 Le 29/01/2023, à 17:17

diesel

Re : [Résolu] Réccupérer une variable liste bash depuis python

Hizoka a écrit :

@diesel

Une variable bash (et a fortiori son contenu), ça n'existe que dans un bash qui tourne.

Sa valeur est en dur dans le code et c'est ça que je veux.

Merci !

Ben, alors, c'est juste une chaîne de caractères dans un fichier texte que tu veux trouver ?

Ça ne me paraît pas bien compliqué et en tous cas, c'est du pur python et ça n'a rien à voir avec bash.

Et d'ailleurs, si ta valeur est fixe (dans le code bash), pourquoi tu ne génères pas directement une constante dans ton script python ?

Moi pas bien causer python, donc moi pas pouvoir aider beaucoup.

Amicalement.

Jean-Marie

Dernière modification par diesel (Le 29/01/2023, à 17:23)


Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.

Hors ligne

#18 Le 30/01/2023, à 14:12

choops

Re : [Résolu] Réccupérer une variable liste bash depuis python

Hizoka a écrit :

@diesel

Une variable bash (et a fortiori son contenu), ça n'existe que dans un bash qui tourne.

Sa valeur est en dur dans le code et c'est ça que je veux.

Si je comprends bien tu as une variable liste décrite dans un script bash et tu veux extraire cette variable pour en faire une autre variable liste en python.

De là, une idée idiote: Et si au lieu de définir ta variable directement en dur dans ton bash elle était définie par lecture d'un fichier texte (appelons le includes.txt, par exemple) contenant les éléments de ta liste comme lignes du fichier ?
Tu n'aurais, à priori, pas plus de difficulté à construire une variable liste en python qui reprendrait les mêmes valeurs pour chaque élément en allant les lire dans le même fichier texte ligne à ligne.
Au passage, pas besoin de mettre des "/' dans le fichier texte de référence pour tes éléments de liste.

Bon, là, je suis au taf sur une bécane windows donc je feinte un peu en passant par du MobaXterm, mais l'idée est là:

  30/01/2023   14:35.41   /home/mobaxterm/test  ll
total 2
drwxr-xr-x    1 1061410  1049089          0 Jan 30 14:33 __pycache__
-rwxr-xr-x    1 1061410  1049089        156 Jan 30 14:25 bash_get_list.sh
-rw-r--r--    1 1061410  1049089         27 Jan 30 14:18 includes.txt
-rwxr-xr-x    1 1061410  1049089        139 Jan 30 14:32 python_get_list.py
                                                                                                                                                                                                             ✓

  30/01/2023   14:35.54   /home/mobaxterm/test  cat includes.txt
FolderImage.sh
Matroska.sh
                                                                                                                                                                                                             ✓
  30/01/2023   14:36.01   /home/mobaxterm/test  cat bash_get_list.sh
#!/usr/bin/env bash

Includes=()

while read element; do
    Includes+=($element)
done < includes.txt

for elt in ${Includes[@]}; do
    echo "- $elt"
done
                                                                                                                                                                                                             ✓

  30/01/2023   14:36.09   /home/mobaxterm/test  ./bash_get_list.sh
- FolderImage.sh
- Matroska.sh
                                                                                                                                                                                                             ✓
  30/01/2023   14:36.15   /home/mobaxterm/test  cat python_get_list.py
#!/usr/bin/env python3

with open('includes.txt') as f:
    lines = f.read().splitlines()

for element in lines:
    print(f"- {element}")
                                                                                                                                                                                                             ✓

  30/01/2023   14:36.21   /home/mobaxterm/test  python python_get_list.py
- FolderImage.sh
- Matroska.sh
                                                                                                                                                                                                             ✓

  30/01/2023   14:36.30   /home/mobaxterm/test 

Dernière modification par choops (Le 30/01/2023, à 14:54)

Hors ligne

#19 Le 03/02/2023, à 19:04

Hizoka

Re : [Résolu] Réccupérer une variable liste bash depuis python

@diesel

Ça ne me paraît pas bien compliqué et en tous cas, c'est du pur python et ça n'a rien à voir avec bash.

Pas faux, mais ca rentre dans Terminal et ligne de commande tongue

Et d'ailleurs, si ta valeur est fixe (dans le code bash), pourquoi tu ne génères pas directement une constante dans ton script python ?

Parce que ce n'est pas la même en fonction des utilisations.

@choops

De là, une idée idiote: Et si au lieu de définir ta variable directement en dur dans ton bash elle était définie par lecture d'un fichier texte (appelons le includes.txt, par exemple) contenant les éléments de ta liste comme lignes du fichier ?
Tu n'aurais, à priori, pas plus de difficulté à construire une variable liste en python qui reprendrait les mêmes valeurs pour chaque élément en allant les lire dans le même fichier texte ligne à ligne.

Ouais j'y ai pensé et ça finira sûrement comme ça d'ici quelques temps mais en attendant je vais pouvoir faire pas mal de tests sans avoir à modifier le bash en plus.
je passerai sûrement par un fichier de config.

Merci à tous


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#20 Le 03/02/2023, à 19:11

iznobe

Re : [Résolu] Réccupérer une variable liste bash depuis python

Bonjour , donc au final c ' est ce que je disais dans mon 1er message tongue


retour utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .

Hors ligne

#21 Le 03/02/2023, à 21:34

Watael

Re : [Résolu] Réccupérer une variable liste bash depuis python

Hizoka a écrit :

@diesel

Ça ne me paraît pas bien compliqué et en tous cas, c'est du pur python et ça n'a rien à voir avec bash.

Pas faux, mais ca rentre dans Terminal et ligne de commande tongue

il y a une section dédiée pourtant :

Développement et programmation
Vous développez un logiciel pour Ubuntu - mais rencontrez des difficultés ? Venez demander aux afficionados du Python et du C++ wink

là, ce n'est pas pour Ubuntu, mais "defilement images horizontal dans jeux pygame" non plus. smile


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne