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

Lazarus Pascal Discussion :

[Linux] Problème avec TProcess


Sujet :

Lazarus Pascal

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mars 2013
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 35
    Points : 24
    Points
    24
    Par défaut [Linux] Problème avec TProcess
    Bonjour,

    Dans un code Lazarus, j'ai besoin d'ouvrir un programme externe. Apres m'être renseigné, voilà ce que j'ai tapé (en ayant bien declaré Process dans les uses) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure TForm1.RUNClick(Sender: TObject);
    begin
         NMP_Process:= TProcess.Create(nil);
         NMP_Process.CommandLine:= '/bin/ping';
             NMP_Process.Options := NMP_Process.Options + [poWaitOnExit];
             NMP_Process.Execute;
             NMP_Process.Free;
    end;
    J'obtiens le message d'erreur suivant : Executable not found: "/bin/ping.exe".
    Cet exécutable est pourtant bien évidemment pr&sent sur mon disque (j'utilise Linux).

    Comment fixer ce problème ?
    Merci

  2. #2
    Membre chevronné

    Homme Profil pro
    au repos
    Inscrit en
    Février 2014
    Messages
    429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : au repos

    Informations forums :
    Inscription : Février 2014
    Messages : 429
    Points : 1 884
    Points
    1 884
    Par défaut
    Bonjour,

    Ce ne peut être qu'un problème de path. Essaie en renseignant le chemin complet.
    Je viens de faire un test (sous Windows) et aucun problème.

    Remarque : "CommandLine" est déprécié.
    Il est préférable de remplacer par "Executable".
    Voir http://forum.lazarus.freepascal.org/...?topic=19643.0

    Thierry

  3. #3
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mars 2013
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 35
    Points : 24
    Points
    24
    Par défaut
    Je viens d'essayer avec "Executable" au lieu de "CommandLine" mais voila l'erreur que j'obtiens :

    unit1.pas(147,18) Error: identifier idents no member "Executable"

    Sinon pour ce qui est du path complet, il me semble que c'est deja le cas avec '/bin/ping', puisque je suis sous Linux.

  4. #4
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 969
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 969
    Points : 15 434
    Points
    15 434
    Par défaut
    Yep !
    Citation Envoyé par remissssss Voir le message
    Je viens d'essayer avec "Executable" au lieu de "CommandLine" mais voila l'erreur que j'obtiens :

    unit1.pas(147,18) Error: identifier idents no member "Executable" (...)
    Doit y avoir une faute de frappe...

    En ce qui me concerne, je me suis bricolé une petite procédure, c'est que du bonheur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    procedure ProcExec(s, p: string; w: boolean);
    var
      aProcess: TProcess;
    begin
      aProcess := TProcess.Create(nil);
      with aProcess do
      begin
        Executable := s;
        if w then Options := Options + [poWaitOnExit];
        if p <> '' then Parameters.Add(p);
        Execute;
        Free;
      end;
    end;
    Exemple d'appel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      ProcExec('gimp', '/chemin/vers/images/une_image.jpg', False);
    end;
    Si besoin de plusieurs paramètres, adapter en conséquence en remplaçant p par p1, p2, etc.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mars 2013
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 35
    Points : 24
    Points
    24
    Par défaut
    Tres belle procedure en effet ! qui ne resout pas le pb néanmoins
    Je vais réecrire mon script, la faute de frappe suggérée ne saute pas aux yeux pourtant

  6. #6
    Membre du Club
    Homme Profil pro
    retraité
    Inscrit en
    Février 2008
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autriche

    Informations professionnelles :
    Activité : retraité
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Février 2008
    Messages : 28
    Points : 59
    Points
    59
    Par défaut
    Bonsoir,

    J'ai fait copier coller avec ta procédure, et dans une console on a bien le résultat.

    Par contre ce qui me parait étrange c'est le message que tu reçois, /bin/ping.exe

    Il n'y a pas d’extension en 'exe' pour les exécutables sous Linux

    Michel.

  7. #7
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 786
    Points : 5 918
    Points
    5 918
    Par défaut
    Bonjour,
    Citation Envoyé par remissssss Voir le message
    Tres belle procedure en effet ! qui ne resout pas le pb néanmoins
    Je vais réecrire mon script, la faute de frappe suggérée ne saute pas aux yeux pourtant
    Quelle version de Lazarus sous Linux ? une 0.9.3x ?
    En ce temps là , la propriété n'était peut-être pas implémentée...

    Sinon, j'aurais ajouté un try finally dans l'exemple pour ne pas risquer de fuite de mémoire...

  8. #8
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mars 2013
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 35
    Points : 24
    Points
    24
    Par défaut
    Alors j'ai repris mon code d'origine avec "Executable".
    Et en fait rien ne se passe (aucun message d'erreur mais le ping ne se lance pas)

    Pareil en essayant d'ouvrir autre chose, par exemple un .txt:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        NMP_Process.CommandLine:= '/home/remi/text.txt';
    Ma version de Lazarus est la derniere disponible (telechargée il y a quelque jour).

  9. #9
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 969
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 969
    Points : 15 434
    Points
    15 434
    Par défaut
    Citation Envoyé par remissssss Voir le message
    Alors j'ai repris mon code d'origine avec "Executable".
    Et en fait rien ne se passe (aucun message d'erreur mais le ping ne se lance pas)
    Qu'est-ce que tu en sais ?
    Parce qu'un ping qui s'exécute ne va pas ouvrir une fenêtre de terminal pour te faire coucou !
    En fait c'est un peu plus compliqué pour le ping, il faut le faire exécuter puis récupérer sa sortie...

    Allez, ch'suis bon prince, tout est là !

    Citation Envoyé par remissssss Voir le message
    Pareil en essayant d'ouvrir autre chose, par exemple un .txt:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        NMP_Process.CommandLine:= '/home/remi/text.txt';
    Et dans ce code, est-ce que tu dis à Linux avec quoi ouvrir ton fichier texte ?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      ProcExec('leafpad', '/chemin/vers/un_fichier.txt', False);
    end;
    s'exécute tip-top avec ma procédure.

  10. #10
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mars 2013
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 35
    Points : 24
    Points
    24
    Par défaut
    Merci grand Prince.

    Quit a jouer au valet recalcitrant, je me permets une remarque. Le lien que tu donnes est certes bien fait mais connu. L'ayant deja parcouru, je n'avais pas réussi a faire ce que je voulais, d'ou mon post sur le forum.

    Et d'ailleurs, tu propose d'utiliser 'ProcExec', qui doit certes marcher mais ca ne resout pas ma question initiale, a savoir utiliser TProcess...

    Tu as raison quand tu dis que je ne précise pas a linux comment ouvrir mon fichier, d'ou la source de l''erreur peut etre (?) mais alors comment le mentionner dans TProcess ?

  11. #11
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 969
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 969
    Points : 15 434
    Points
    15 434
    Par défaut
    Citation Envoyé par remissssss Voir le message
    Et d'ailleurs, tu proposes d'utiliser 'ProcExec', qui doit certes marcher fonctionner (ce sont les animaux et les humains qui marchent) mais ça ne résout pas ma question initiale, à savoir utiliser TProcess...
    Hey, t'es boulet ou tu le fais exprès ?

    Grand 1, le lien que je t'ai donné c'est celui dont je me suis inspiré pour étudier tout ça ; y a des exemples, tu copies/colles dans un projet et tu joues avec en étudiant les résultats...
    Grand 2, si t'as pas compris que ProcExec était le nom de ma procédure qui exécute TProcess c'est grave !

    Citation Envoyé par remissssss Voir le message
    Tu as raison quand tu dis que je ne précise pas à linux comment ouvrir mon fichier, d'où la source de l''erreur peut-être (?) mais alors comment le mentionner dans TProcess ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      ProcExec('leafpad', '/chemin/vers/un_fichier.txt', False);
    end;

  12. #12
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mars 2013
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 35
    Points : 24
    Points
    24
    Par défaut
    Merci beaucou
    j'ai fais des progres en francais grace a toi !

  13. #13
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 564
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 564
    Points : 3 968
    Points
    3 968
    Par défaut
    Salut

    As-tu consulté le source du composant (Ctrl+Clic sur TProcess dans l'éditeur) ?
    Est-ce que par haasard, tu n'aurais pas configuré ton projet pour faire de la compilation croisée (i.e. générer un exécutable pour Windows depuis Linux) ? Vérifie tes options de projets.

    @+

  14. #14
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mars 2013
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 35
    Points : 24
    Points
    24
    Par défaut
    J'ai ouvert le source de TProcess, je n'y comprends pas grd chose... Quand a la compilation croisée, idem.. je vais creuser un peu plus cette piste qd meme.

    Michel pour reprendre ce que tu disais,
    J'ai fait copier coller avec ta procédure, et dans une console on a bien le résultat.
    Tu veux dire que chez toi ca t'a ouvert une fenetre console avec le ping?

  15. #15
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 564
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 564
    Points : 3 968
    Points
    3 968
    Par défaut
    Salut,

    Pour la compilation croisée, oublie, tu ne pourrais pas exécuter sous Linux, désolé pour la mauvaise piste.

    Michel a raison, la chose curieuse est l'ajout de '.exe' dans ta ligne, de commande. Cela aurait du sens sous Windows mais là ...
    J'ai repris ton code et l'ai essayé sous Linux, pas de message d'erreur, sauf si je force avec NMP_Process.CommandLine:= '/bin/ping.exe';

    J'ai regardé le source process.pp, c'est pas de la tarte, en espérant voir une constante '.exe' dans le source, mais rien ...

    Tu n'as installé que la version 1.2.0 de Lazarus ? Pas d'autres versions avant ? Est-ce que tu as créé l'exécutable complètement sous Linux et pas une partie sous Windows auparavant ?

    Enfin est-ce que tu utilise l'unité standard pour TProcess (à savoir en faisant Ctrl-Clic sur TProcess, puis une fois l'unité ouverte tu obtiens les informations sur l'unité dans le menu [Source|Informations sur l'unité], ce devrait être /usr/share/fpcsrc/2.6.2/packages/fcl-process/src/process.pp)

    Si cela peut t'aider.

    @+

  16. #16
    Membre du Club
    Homme Profil pro
    retraité
    Inscrit en
    Février 2008
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autriche

    Informations professionnelles :
    Activité : retraité
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Février 2008
    Messages : 28
    Points : 59
    Points
    59
    Par défaut
    Bonsoir,

    En fait j'ai utilisé un truc simple mais qui permet de lire d'éventuels messages d'erreurs quand on lance le programme dans un terminal.

    Dans ton gestionnaire de fichier, on a le plus souvent l'option "ouvrir un terminal" dans le menu contextuel qui apparait en faisant un clic droit dans le répertoire choisi, en l’occurrence celui ou tu as sauvegardé ton projet. Une fois le terminal ouvert il faut, pour lancer le programme taper: ./nom_du_programme.

    Durant l’exécution peuvent s'afficher différents messages qui permettent bien des fois de mieux connaitre le comportement du programme.

    Nom : ping.png
Affichages : 417
Taille : 86,6 Ko


    Dans le cas précis on voit que ping s'est executé normalement

    Tente la manip et donne nous le résultat

    Bon courage.

    Michel.

  17. #17
    Membre extrêmement actif Avatar de Jon Shannow
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Avril 2011
    Messages
    4 538
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2011
    Messages : 4 538
    Points : 10 338
    Points
    10 338
    Par défaut
    Citation Envoyé par remissssss Voir le message
    Merci beaucou
    j'ai fais des progres en francais grace a toi !
    Ça ne se lit pas tellement...

  18. #18
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mars 2013
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 35
    Points : 24
    Points
    24
    Par défaut
    Citation Envoyé par Jon Shannow Voir le message
    Ça ne se lit pas tellement...
    trop de subtilités peut etre, c'etait bien sur de l'ironie tronquée

Discussions similaires

  1. Réponses: 4
    Dernier message: 22/09/2010, 10h30
  2. [Lazarus] [Linux] Problème avec les points d'arrêts
    Par ovni76 dans le forum Lazarus
    Réponses: 6
    Dernier message: 15/02/2010, 23h45
  3. [Lazarus] [0.9.26/Linux] Problème avec DBGrid et TDBF
    Par ovni76 dans le forum Lazarus
    Réponses: 2
    Dernier message: 02/02/2009, 20h57
  4. Linux - problème avec fifos (communication IPC)
    Par wiliwiliwili dans le forum Linux
    Réponses: 4
    Dernier message: 27/08/2007, 23h18

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