IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Passer une commande bash non ephemere, permanente. [Python 3.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Vagabong étudiant en annalyse du signal.
    Inscrit en
    Avril 2019
    Messages
    130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Vagabong étudiant en annalyse du signal.
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2019
    Messages : 130
    Par défaut Passer une commande bash non ephemere, permanente.
    Bonjour,

    Dans un script, python modifie le contenu de .bashrc
    J'aimerais que python puisse recharger ce fichier, et que le chargement reste effectif meme une fois le script termine.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    robin@poussifix:~$ ma_commande
    ma_commande: command not found
    robin@poussifix:~$ python3
    Python 3.8.5 (default, Jul 28 2020, 12:59:40) 
    [GCC 9.3.0] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import os
    >>> os.system("alias ma_commande='ls'")
    0
    >>> exit()
    robin@poussifix:~$ ma_commande
    ma_commande: command not found
    robin@poussifix:~$
    Bref des que je sors de l'interpreteur, les commandes passees perdent leur effets.
    subprocess semble plus puissant (https://docs.python.org/3/library/subprocess.html) mais je ne sais pas si il peux repondre a ce probleme.

    Merci

  2. #2
    Membre Expert
    Avatar de MPython Alaplancha
    Homme Profil pro
    Paysan à 3 francs six sous
    Inscrit en
    Juin 2018
    Messages
    923
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Paysan à 3 francs six sous
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2018
    Messages : 923
    Billets dans le blog
    8
    Par défaut
    Bonjour,
    Je n'ai pas compris . Tu veux modifier ton bashrc depuis python?
    édit:
    Ah oui ,tu veux que la modification inscrite dans ton bashrc existe dans l'interpreteur python.. C'est bien ça?

  3. #3
    Membre Expert
    Avatar de MPython Alaplancha
    Homme Profil pro
    Paysan à 3 francs six sous
    Inscrit en
    Juin 2018
    Messages
    923
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Paysan à 3 francs six sous
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2018
    Messages : 923
    Billets dans le blog
    8
    Par défaut
    Si j'ai bien traduit ta demande, celle-ci concerne plutôt le shell.
    Pour créer une nouvelle commande dans le shell, tu peux mettre ton script 'nouvelle_commande" dans /usr/bin/
    Tu le rends exécutable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    chmod +x nouvelle_commande
    Il sera désormais accessible comme les autres commandes shell depuis python...

  4. #4
    Membre éprouvé
    Homme Profil pro
    Vagabong étudiant en annalyse du signal.
    Inscrit en
    Avril 2019
    Messages
    130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Vagabong étudiant en annalyse du signal.
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2019
    Messages : 130
    Par défaut
    Citation Envoyé par Hominidé Voir le message
    Bonjour,
    Je n'ai pas compris . Tu veux modifier ton bashrc depuis python?
    édit:
    Ah oui ,tu veux que la modification inscrite dans ton bashrc existe dans l'interpreteur python.. C'est bien ça?
    J'aimerai que la modification inscrite dans le .bashrc existe en dehors de l'interpreteur python.

    Là pas possible, définitivement. Parce que là, tu te heurtes à l'OS (je présume que c'est de l'Unix/Linux)
    Aille! Ca repond trop bien a ma question. zut!
    Si le processus fils n'a pas de pouvoir sur le processus parent. Il y a t-il un moyen que le processus fils demande 'poliment' au processus parent d'executer une commande? De cette facon ce n'est pas le fils mais le pere qui execute l'instruction.

    Mais merci pour ces reponses claires et decevantes

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par robinechuca Voir le message
    J'aimerai que la modification inscrite dans le .bashrc existe en dehors de l'interpreteur python.
    Pas de souci. Python ouvre le .bashrc (fopen), le lit et stocke son contenu dans sa mémoire (readline), rajoute dans sa mémoire ce qu'il faut modifier et réécrit le tout (write). Tout ça reste très classique

    Citation Envoyé par robinechuca Voir le message
    Si le processus fils n'a pas de pouvoir sur le processus parent. Il y a t-il un moyen que le processus fils demande 'poliment' au processus parent d'executer une commande? De cette facon ce n'est pas le fils mais le pere qui execute l'instruction.
    Hé non. Parce que le parent, c'est le bash dans lequel tu évolues au quotidien et que ce bash n'est pas serveur (il n'a pas d'outil lui permettant de recevoir une requête venant d'un autre processus). Ce qui est d'ailleurs un gage de sécurité (les serveurs sont généralement le point de faiblesse des OS car c'est par là que les hackeurs tentent de rentrer).

    Ok par ailleurs il existe des outils (exemple le "cron") qui peuvent être "réveillés" par un signal externe (kill -1) pour recharger leur configuration. Cela aurait pu être un truc utile pour le shell. Malheureusemnt cette possibilité ne lui a pas été programmée.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 349
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 349
    Par défaut
    Oui, mais on pourrait le faire en définissant un trap coté père (exemple simple en bash) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    1$ trap 'source /tmp/file.sh' 12
    1$ alias cmd_test
    bash: alias: cmd_test : non trouvé
    1$ bash
    2$ echo "alias cmd_test='ls -al'" >/tmp/file.sh
    2$ kill -12 $PPID
    2$ exit
    1$ alias cmd_test
    alias cmd_test='ls -al'

  7. #7
    Membre éprouvé
    Homme Profil pro
    Vagabong étudiant en annalyse du signal.
    Inscrit en
    Avril 2019
    Messages
    130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Vagabong étudiant en annalyse du signal.
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2019
    Messages : 130
    Par défaut
    Pas de souci. Python ouvre le .bashrc (fopen), le lit et stocke son contenu dans sa mémoire (readline), rajoute dans sa mémoire ce qu'il faut modifier et réécrit le tout (write). Tout ça reste très classique
    Oui oui, il n'y a aucun souci la dessus, je l'ai fait sans probleme. Je ne me suis pas exprime clairement dans ce message mais le probleme, c'est celui que vous avez evoque dans la deuxieme partie du message.

    Je ne comprend pas l'integralitee de ce code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    $ trap 'source /tmp/file.sh' 12           # Ca veut dire que quand le processus 12 meurt, on excecute le fichier 'file.sh' ?
    1$ alias cmd_test                             # Pourquoi avoir choisi le numero 12 ?
    bash: alias: cmd_test : non trouvé   # La je comprends.
    1$ bash                                            # Ca par contre ca fait quoi?
    2$ echo "alias cmd_test='ls -al'" >/tmp/file.sh # Ca rajoute bien cette ligne a la fin de '/tmp/file.sh' ?
    2$ kill -12 $PPID                              # En arrivant la ca a ferme toutes les fenetres ouvertes en ssh, don le terminal.
    2$ exit                                              # Est-ce que c'est pour sortir de la commande 'bash' 2 lignes plus haut?
    1$ alias cmd_test                             # La fin c'est ok.
    alias cmd_test='ls -al'
    Je comprends vaguement l'idee generale mais je ne vois pas en quoi ca resoud le probleme, Si je definis un piege depuis python, pourquoi serai-t-il capte par le terminal pere?

  8. #8
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Oui, mais on pourrait le faire en définissant un trap coté père (exemple simple en bash) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    1$ trap 'source /tmp/file.sh' 12
    1$ alias cmd_test
    1$ bash
    2$ echo "alias cmd_test='ls -al'" >/tmp/file.sh
    2$ kill -12 $PPID
    2$ exit
    1$ alias cmd_test
    alias cmd_test='ls -al'
    Pas mal du tout !!! Il suffit alors au script Python d'envoyer un signal SIGUSR1 à son père
    Un peu tordu et fragile (il ne faut pas que le script Python soit lancé d'autre part) mais brillant

    Citation Envoyé par robinechuca Voir le message
    Finalement, la solution avec le 'trap' ne resoud pas le probleme car il faut tout de meme faire une intervention dans le shell parent.
    Oui mais cette intervention peut être inscrite dans le fichier .bashrc. Chaque shell sera donc "automatiquement" préprogrammé à traiter le signal reçu

    Citation Envoyé par robinechuca Voir le message
    Ca echoue, mais j'ai l'impression que c'est plus une histoire de syntaxe. Si la syntaxe etait correcte, est-ce que ca aurrait des chances de fonctionner?
    J'ai fait un test et ça a marché
    1) dans mon fichier "~/.bashrc", j'ai écrit l'instruction trap 'source /tmp/file.sh' SIGHUP (désolé disedorgue, j'ai préféré utiliser SIGHUP semblant être plus conventionnel pour ce genre d'action )
    2) j'ai écrit le script Python suivant
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #!/usr/bin/env python3
    #coding: utf-8
     
    with open("/tmp/file.sh", "a") as fp:
    	print("alias xxx='ls -al'", file=fp)
     
    import os
    import signal
    os.kill(os.getppid(), signal.SIGHUP)

    Ensuite, je lance un shell. Si j'appelle la commande xxx ça me répond xxx: commande introuvable. Puis je lance mon script Python, et ensuite je peux taper xxx et j'obtiens mon "ls"

    Citation Envoyé par robinechuca Voir le message
    Dans mon cas, le script python est un script d'installation. L'idee c'est qu'il n'y absolument aucune intervention a faire ailleur.
    Ben si c'est un truc d'installation, cela veut dire que tu n'as pas besoin d'avoir l'alias disponible immédiatement. Imagine que le script rajoute un alias dans le fichier "~/.bashrc", l'alias est alors bel et bien installé. Et l'utilisateur qui lancera son shell aura alors accès à l'alias.
    Quand j'installe un truc, le truc se déroule puis me dit" ok c'est installé" et j'i immédiatement accès au truc. Parfois s'il faut recharger une config, le truc me dit "redémarrez l'appli" ou bien "redémarrez l'ordi" et voilà quoi. Je me reconnecte, toute la config modifiée par le truc est alors rechargée et basta.

    J'ai l'impression que tu nous as posé un problème xy (au lieu de venir nous poser le vrai problème, tu nous as demandé comment résoudre la solution que tu avais imaginé, solution n'étant pas forcément la plus adéquate par rapport au problème initial).
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  9. #9
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par robinechuca Voir le message
    Dans un script, python modifie le contenu de .bashrc
    Jusque là, pas de problème. Tu ouvres le .bashrc, tu le modifies et tu le refermes. Python sait très bien faire cela.

    Citation Envoyé par robinechuca Voir le message
    J'aimerais que python puisse recharger ce fichier, et que le chargement reste effectif meme une fois le script termine.
    Là pas possible, définitivement. Parce que là, tu te heurtes à l'OS (je présume que c'est de l'Unix/Linux)
    Linux a un système de gestion de ses processus extrêmement rigoureuse. Chaque nouveau processus (fils de celui qui le lance) est totalement indépendant et décorellé de celui de son père. A tel point qu'il faut passer par des outils de communication spécifique quand on veut les faire communiquer entre eux.
    Donc quand tu es dans ton shell et que tu lances python mon_script.py, le programme Python se déroule dans un nouveau shell indépendant. Et même si ce shell peut charger (au travers de la commande source) le .bashrc modifié, il n'en restera pas moins que ce shell reste fils de celui dans lequel toi tu évolues. Et en aucun cas un fils peut influer sur son père (à tel point qu'il n'existe même aucun moyen pour que ne serait-ce qu'une simple variable shell modifiée dans un fils remonte vers son père).

    Solution palliative: tu crées un python qui modifie ton .bashrc (ce qui en soit est déjà assez bizarre, un .bashrc ne se modife pas tous les 4 matins qu'on ait besoin d'un script pour ça et perso j'aime beaucoup Python mais si je devais écrire un script qui rajoute un alias dans le .bashrc je l'écrirais en shell, ça irait plus vite => echo "alias ma_commande='ls'" >>~/.bashrc) puis une fois le script terminé, je recharge le .bashrc manuellement => source ~/.bashrc.

    PS: c'est "éphémère" et "permanente".
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Peut-on exécuter/invoquer/appeler une commande readline non liée du bash?
    Par jack-ft dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 20/10/2013, 18h29
  2. Passer une commande DOS par CodeBehind
    Par zooffy dans le forum ASP.NET
    Réponses: 20
    Dernier message: 04/02/2011, 13h36
  3. [Système] Une variable PHP dans une commande bash
    Par aroua dans le forum Langage
    Réponses: 1
    Dernier message: 19/07/2007, 16h23
  4. Réponses: 5
    Dernier message: 01/07/2007, 20h25
  5. [Modélisation]Passer une commande
    Par soad029 dans le forum Schéma
    Réponses: 4
    Dernier message: 15/11/2006, 21h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo