#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 COMPLET et 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 ?
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
Dernière modification par iznobe (Le 27/01/2023, à 19:23)
retour COMPLET et 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
Un truc comme ça ? https://stackoverflow.com/a/33829676
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
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
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
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
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
@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
@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
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
retour COMPLET et 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
@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
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++
là, ce n'est pas pour Ubuntu, mais "defilement images horizontal dans jeux pygame" non plus.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne