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 :

Connaitre la façon dont a été lancé le script


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 563
    Par défaut Connaitre la façon dont a été lancé le script
    Bonjour,

    je souhaiterai savoir s'il existait un moyen simple de déterminer en python3 comment à été exécuté le script.

    Je voudrais faire la différence entre :
    - l'utilisateur a fait un (double) clic sur le fichier pour le lancer de façon graphique
    - l'utilisateur a rentré une ligne de code dans une console ou un terminal (./fichier ; python3 fichier...)

    je me suis dis qu'avec sys.agrv il y avait peut être une idée :
    sys.agrv[0] mode graphique : j'ai le path entier du fichier
    sys.agrv[0] mode terminal : j'ai juste le nom du script ou ./fichier

    mais il suffit de donner le path entier lorsqu'on rentre la commande pour qu'on ne puisse plus faire la différence.

    Une idée ?

    Merci à vous.

  2. #2
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    salut,

    Citation Envoyé par hizoka Voir le message
    je me suis dis qu'avec sys.agrv il y avait peut être une idée :
    sys.agrv[0] mode graphique : j'ai le path entier du fichier
    sys.agrv[0] mode terminal : j'ai juste le nom du script ou ./fichier

    mais il suffit de donner le path entier lorsqu'on rentre la commande pour qu'on ne puisse plus faire la différence.
    oui, c'est peu simpliste comme déterminant on va dire, à la fois il n'y a pas de manière sûre à 100%, c'est une méthode comme une autre

    une autre méthode pourrait consister -sous Linux au moins- à vérifier le processus père, si c'est bash c'est probablement qu'on a lancé depuis la console par exemple
    on peut peut-être aussi compter sur le fait que les processus fils héritent de l'environnement de leur père, peut-être y a-t-il une manière de ruser en trouvant une variable d'environnement suffisamment discriminante, mais dans l'absolu tout ça reste de l'ordre du hack pas très fiable

  3. #3
    Membre Expert
    Homme Profil pro
    sans emploi
    Inscrit en
    Janvier 2014
    Messages
    539
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2014
    Messages : 539
    Par défaut
    Bonjour,

    si tu double-cliques sur une icône pour lancer ton script alors à un moment donné ou un autre tu as associé l'extension .py (par exemple) à l'interpréteur python. Alors au lieu de l'associer avec cet interpréteur, associe la avec un script qui positionnera soit une variable d'environnement soit appellera ton script avec un argument, soit … cela te permettra de discriminer la manière dont tu as lancé le script.

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 754
    Par défaut
    Citation Envoyé par hizoka Voir le message
    je souhaiterai savoir s'il existait un moyen simple de déterminer en python3 comment à été exécuté le script.

    Je voudrais faire la différence entre :
    - l'utilisateur a fait un (double) clic sur le fichier pour le lancer de façon graphique
    - l'utilisateur a rentré une ligne de code dans une console ou un terminal (./fichier ; python3 fichier...)

    je me suis dis qu'avec sys.agrv il y avait peut être une idée :
    sys.agrv[0] mode graphique : j'ai le path entier du fichier
    sys.agrv[0] mode terminal : j'ai juste le nom du script ou ./fichier

    mais il suffit de donner le path entier lorsqu'on rentre la commande pour qu'on ne puisse plus faire la différence.

    Une idée ?
    C'est typiquement une question à poser dans les forums OS: s'il y a quelque chose à tester pour le savoir, c'est là bas que traînent les gens qui savent. Et la réponse n'intéresse pas que le programmeur Python.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 563
    Par défaut
    Bonjour,

    merci pour vos réponses, je ne pensais pas que ça serait aussi compliqué

    c'était une idée qui m'avait traversé l'esprit et pour la culture.

    mais pour le coup, je vais laissé tomber si c'est si compliqué.

  6. #6
    Membre chevronné
    Homme Profil pro
    Développeur banc de test
    Inscrit en
    Mai 2014
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur banc de test
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2014
    Messages : 199
    Par défaut
    Bonjour,

    Sous Windows si une application ou fichier est appelé depuis l'explorateur (explorer.exe), l'interpréteur par exemple python.exe va être un sous-processus de explorer.exe.

    Nom : py explorer.png
Affichages : 196
Taille : 3,4 Ko

    S'il est appelé depuis la console (cmd.exe, lui-même sous-processus d'explorer.exe), l'interpréteur par exemple python.exe va être un sous-processus de cmd.exe.

    Nom : py cmd.png
Affichages : 175
Taille : 1,0 Ko

    Il suffit donc de trouver la commande OS qui retourne le thread/processus parent de l'application lancée, si la fonction n'existe pas sous Python il est possible d'appeler la fonction du kernel avec ctypes. C'est une question à poser dans la section programmation en C.

    Une piste que j'ai trouvé : GetCurrentProcess

    Bon courage pour la suite,

  7. #7
    Membre chevronné
    Homme Profil pro
    Développeur banc de test
    Inscrit en
    Mai 2014
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur banc de test
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2014
    Messages : 199
    Par défaut
    Je reviens sur le sujet,

    Citation Envoyé par Giampaolo Rodolà
    By using psutil ( https://github.com/giampaolo/psutil ):

    >>> import psutil, os
    >>> psutil.Process(os.getpid()).ppid()
    2335
    >>> psutil.Process(os.getpid()).parent
    <psutil.Process (pid=2335, name='bash', cmdline='bash') at 140052120886608>
    >>>
    os.getpid()
    Return the current process id.

    os.getppid()
    Return the parent’s process id.

    psutil.Process(pid=None)
    Represents an OS process with the given PID.

    psutil.Process().parent()
    Return the parent process as a Process object pre-emptively

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    import psutil # A cross-platform process and system utilities module for Python
    import os # Miscellaneous operating system interfaces
     
    process = psutil.Process(os.getpid())
     
    while process is not None: # {
    	print(process.pid, process.name())
    	process = process.parent()
    # }
    Ce qui donne sous Windows depuis l'IDLE (double processus pythonw.exe):

    3476 pythonw.exe
    1276 pythonw.exe
    1604 explorer.exe
    Et depuis la console :

    2540 python.exe
    3304 cmd.exe
    1604 explorer.exe
    Il reste ensuite à gérer le cas des plateforms, Linux, Windows Mac OS.

    Je retiens cette lib au passage elle est bien pratique.

  8. #8
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 563
    Par défaut
    Merci pour ton explication

    pour infos, sous kde:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    6339 python3
    6312 bash
    3221 kdeinit5

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 04/09/2015, 11h46
  2. [2008R2] Connaitre le nom de la procédure lancée au démarrage (sp_procoption) ?
    Par hmira dans le forum Administration
    Réponses: 2
    Dernier message: 20/05/2014, 16h40
  3. Réponses: 3
    Dernier message: 04/08/2008, 16h33
  4. cron:lance un script dès la reception d'un fichier
    Par hammag dans le forum Administration système
    Réponses: 5
    Dernier message: 29/04/2008, 09h00
  5. [FLASH MX2004] Façon dont la lecture se fait
    Par vbcasimir dans le forum Flash
    Réponses: 2
    Dernier message: 21/02/2006, 11h15

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