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

Shell et commandes GNU Discussion :

Exécuter un .sh pour activer un environnement virtuel


Sujet :

Shell et commandes GNU

  1. #1
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2011
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2011
    Messages : 46
    Points : 18
    Points
    18
    Par défaut Exécuter un .sh pour activer un environnement virtuel
    Bonjour à tous,

    J'ai essayé plusieurs solutions trouvé sur internet, mais je n'arrive pas à y arriver.

    J'ai un script Python3 fonctionnant sur Ubuntu.

    Pour faire fonctionner le script, je dois être dans un environnement virtuel.

    Mon script ce trouve dans :
    root@ubuntu:/home/iot_devices/main.py
    Pour activer l'environnement virtuel, j'écris dans le terminal :
    root@ubuntu:/home/iot_devices# source .venv/bin/activate
    (.venv) root@ubuntu:/home/iot_devices#
    J'ai créé un fichier demarrer_script.sh avec (trouvé exemple sur internet):
    #!/bin/bash
    source .venv/bin/activate
    python3 main.py
    Je dois pouvoir exécuter mon script au démarrage:
    crontab -e
    @reboot /home/iot_devices/demarrer_script.sh
    Cela ne fonctionne pas.

    Si j'exécute dans le répertoire /home/iot_devices les commandes suivantes, cela fonctionne:
    source .venv/bin/activate
    python3 main.py
    Pouvez-vous me donner un coup de main pour activer l'environnement virtuel et exécuter mon script ?

    Merci

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 584
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 584
    Points : 19 461
    Points
    19 461
    Par défaut
    Bonjour,

    quel est cet environnement virtuel ?
    pourquoi le script ne s'y trouve-t-il pas ?
    existe-t-il une commande de cet environnement virtuel pour exécuter une commande extérieure dans cet environnement ?
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 201
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 201
    Points : 4 665
    Points
    4 665
    Par défaut
    bonjour
    Citation Envoyé par Gregory_007 Voir le message

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    @reboot /home/iot_devices/demarrer_script.sh
    source .venv/bin/activate   # OOPS non trouvé
    confusion entre les chemins relatifs et absolu




    @N_BaH
    puisque tu fais un peu de python :
    Depuis un an (variable suivant les os/distributions), pip install PAQUET se bloque et conseille d'installer nos paquets que dans des environnements virtuel
    c'est un environnement virtuel python très très classique (que devrait utiliser tout dev python), cela permet d'avoir ces dépendances python dans ce sous répertoire .venv de notre projet (et pas installées dans notre système). Cela permet aussi d'avoir des versions de paquets différentes du système et des versions différentes entre chaque projet. On fait des "pip install" uniquement dans cet environnement virtuel.
    En gros, source .venv/..., va modifier le $PATH pour appeler un python configuré dans le sous répertoire ".venv"
    Existe pas mal d'outils python pour faire cela.

    exemple (j'utilise uv pour cela, ici il fait des hard liens(ou liens symbolique) depuis son cache pour recréer un /usr/lib/pythonXX/ spécifique au projet)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    $ uv venv  # créer l'environnement virtuel dans ./.venv/
    # j'ai un python en "local" :
    ls -l ./.venv/bin
    total 40K
    -rw-r--r-- 1 patrick users 3,4K  5 juil. 16:03 activate
    -rw-r--r-- 1 patrick users 2,3K  5 juil. 16:03 activate.bat
    -rw-r--r-- 1 patrick users 2,6K  5 juil. 16:03 activate.csh
    -rw-r--r-- 1 patrick users 4,2K  5 juil. 16:03 activate.fish
    ...
    lrwxrwxrwx 1 patrick users   19  5 juil. 16:03 python -> /usr/bin/python3.12
    lrwxrwxrwx 1 patrick users    6  5 juil. 16:03 python3 -> python
    lrwxrwxrwx 1 patrick users    6  5 juil. 16:03 python3.12 -> python
     
    # uv pip install truc machin chose
    # il a ces propres paquets comme avec /lib/python3.12
     
    # cd .venv/lib/python3.12/site-packages/PySide6
    $ pwd
    /home/patrick/workspace/python/QT6/pacman-logs/.venv/lib/python3.12/site-packages/PySide6
    $ ls -l
    ll
    total 103M
    -rwxr-xr-x  2 patrick users 1,8M  1 juil. 01:38 assistant
    -rwxr-xr-x  2 patrick users  65K  1 juil. 01:38 balsam
    -rwxr-xr-x  2 patrick users 123K  1 juil. 01:38 balsamui
    -rw-r--r--  2 patrick users  802  1 juil. 01:38 _config.py
    -rwxr-xr-x  2 patrick users 644K  1 juil. 01:38 designer
    -rw-r--r--  2 patrick users  246  1 juil. 01:38 __feature__.pyi
    -rw-r--r--  2 patrick users  657  1 juil. 01:38 _git_pyside_version.py
    drwxr-xr-x  2 patrick users 4,0K  1 juil. 01:40 glue
    drwxr-xr-x 57 patrick users 4,0K  1 juil. 01:40 include
     
    hard liens donc .venv créé en une seconde et léger en place disque
    $moi= ( !== ) ? : ;

  4. #4
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 584
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 584
    Points : 19 461
    Points
    19 461
    Par défaut
    ok.
    merci
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2011
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2011
    Messages : 46
    Points : 18
    Points
    18
    Par défaut
    Merci @papajoker pour ta réponse.

    Si je comprends bien, je dois mettre dans crontab :
    @reboot /home/iot_devices/demarrer_script.sh
    source /home/iot_devices/.venv/bin/activate
    C'est bien ce que tu voulais dire ?

    Merci

  6. #6
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 201
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 201
    Points : 4 665
    Points
    4 665
    Par défaut
    pas vraiment, il faut changer le path (ou faire un "cd") dans ton script lancer.sh (ici relatif ne fonctionne pas)
    tu peux entre autre utiliser dirname "$0".

    (même problème pour trouver main.py )
    $moi= ( !== ) ? : ;

  7. #7
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2011
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2011
    Messages : 46
    Points : 18
    Points
    18
    Par défaut
    Je suis désolé, mais je dois encore faire quelque chose de mal car cela ne fonctionne pas.

    Voici un récapitulatif de tout :

    J'ai un script main.py qui est dans
    /home/iot_devices
    J'ai un shell demarrer_script.sh pour démarrer le script et l'environnement virtuel qui est lui aussi dans
    /home/iot_devices
    Dans demarrer_script.sh :
    source /home/iot_devices/.venv/bin/activate
    python3 /home/iot_devices/main.py
    Dans crontab :
    @reboot /home/iot_devices/demarrer_script.sh
    Cela ne fonctionne pas.

    Si je vais dans mon répertoire iot_devices
    source demarrer_script.sh
    J'ai le message d'erreur de main.py comme quoi il n'a pas trouvé certaines librairies.

    Si je lance manuellement l'environnement virtuel, main.py fonctionne.

    Qu'est-ce que j'ai mal fait ?

    Merci

  8. #8
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2011
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2011
    Messages : 46
    Points : 18
    Points
    18
    Par défaut
    Ha.... Tu veux dire que dans demarrer_script.sh je dois écrire
    cd /home/iot_devices
    source .venv/bin/activate
    python3 main.py
    Je vais essayer lundi.

    Merci encore pour ton aide

  9. #9
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 201
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 201
    Points : 4 665
    Points
    4 665
    Par défaut
    Normalement ton test #7 devrait fonctionner ???

    C'est à toi d'ajouter du bla bla dans ton script pour afficher/voir des variables intéressantes. C'est la moindre des choses.

    Ha.... Tu veux dire que dans demarrer_script.sh je dois écrire
    cd /home/iot_devices
    Tu déformes mes paroles
    j'ai écrit qu'il est possible de l'utiliser, voici un script bash qui permet de tester en toute lucidité. Et justement je n'ai pas utilisé de cd et, bizarrement il fonctionne.

    exemple d'appel tordu (c'est un peu le but...)
    sortie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    Avant virtuel env
    Platform: "linux-x86_64"
    Python version: "3.12"
    Current installation scheme: "posix_prefix"
     
    Paths: 
            data = "/usr"
            include = "/usr/include/python3.12"
            platinclude = "/usr/include/python3.12"
            platlib = "/usr/lib/python3.12/site-packages"
            platstdlib = "/usr/lib/python3.12"
            purelib = "/usr/lib/python3.12/site-packages"
            scripts = "/usr/bin"
            stdlib = "/usr/lib/python3.12"
     
    ../../test/run.sh
    Directory: ../../test
    /home/patrick/workspace/python/QT6/pacman-logs
     
    Dans virtuel env
    python3: /usr/bin/python3 /home/patrick/workspace/python/test/.venv/bin/python3 /home/patrick/.pyenv/shims/python3 /usr/share/man/man1/python3.1.gz
    VIRTUAL_ENV=/home/patrick/workspace/python/test/.venv
    VIRTUAL_ENV_PROMPT=test
    Platform: "linux-x86_64"
    Python version: "3.12"
    Current installation scheme: "venv"
            data = "/home/patrick/workspace/python/test/.venv"
            platlib = "/home/patrick/workspace/python/test/.venv/lib/python3.12/site-packages"
            platstdlib = "/home/patrick/workspace/python/test/.venv/lib/python3.12"
     
     
    RUN PYTHON SCRIPT ...
    hello
     
    Sortie du virtuel env
    On peut voir pas mal (même trop) de variables intéressantes pour savoir si on est bien dans un environnement virtuel.
    -> Current installation scheme: "venv"
    --> Paths
    --> Mais surtout les 2 variables d'environnement
    ps: si environnement virtuel mal configuré (manque une lib dedans) ou script python mauvais, c'est une autre histoire. Mais au moins, tu sais si ton script bash est bon ou non.

    script bateau de test
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    #!/usr/bin/env bash
     
    echo "Avant virtuel env"
    echo "$(python3 -m sysconfig)" | head -n14     # pas beau ! sinon "| head -n14" est pris comme paramètre à python et non à bash
     
     
    echo "$0"
    current=$(dirname "$0")
    echo "Directory: $current"
    #cd "$current"  # optionel ?
    pwd
     
    source "$current/.venv/bin/activate"
    echo
    echo "Dans virtuel env"
    whereis python3
    env | grep -E 'VIRTUAL_ENV'
    python3 -m sysconfig | grep -E 'data =|scheme|platlib |platstdlib'
     
     
    echo
    echo "RUN PYTHON SCRIPT ..."
    python3 "$current/main.py"
     
     
    echo
    echo "Sortie du virtuel env..."
    deactivate    # non utile ;)
    env | grep -E 'VIRTUAL_ENV'    # vide
    $moi= ( !== ) ? : ;

  10. #10
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 584
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 584
    Points : 19 461
    Points
    19 461
    Par défaut
    Citation Envoyé par papajoker
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo "$(python3 -m sysconfig)" | head -n14     # pas beau ! sinon "| head -n14" est pris comme paramètre à python et non à bash
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    python3 -m sysconfig -- | head -n14
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    current=$(dirname "$0")
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  11. #11
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 201
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 201
    Points : 4 665
    Points
    4 665
    Par défaut
    je suis étonné que ce filtre head fonctionne chez toi. Cela avait été ma première idée d'utiliser -- pour palier le plantage. Mais cela donne un plantage chez moi de python quel que soit le shell: bash, zsh et fish.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ...
    BrokenPipeError: [Errno 32] Broken pipe
    EDIT
    A noter que l'erreur python est bien à l'affichage de la ligne 14 Et que python3 -m sysconfig | wc -l est OK je n'avais pas fait le test...
    Donc, au final, en réfléchissant un peu plus aujourd'hui, cela est un plantage (connu mais pas par moi) car python n'a plus de stdout pour afficher ces 1000 lignes.
    depuis des années, j'écris des scripts python qui ne supportent pas le filtre head ou "grep -m1" ! (merci d'être revenu sur ce truc )
    $moi= ( !== ) ? : ;

  12. #12
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 584
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 584
    Points : 19 461
    Points
    19 461
    Par défaut
    Citation Envoyé par papajoker Voir le message
    je suis étonné que ce filtre head fonctionne chez toi. Cela avait été ma première idée d'utiliser -- pour palier le plantage. Mais cela donne un plantage chez moi de python quel que soit le shell: bash, zsh et fish.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ...
    BrokenPipeError: [Errno 32] Broken pipe
    non, je l'ai encore, mais je ne l'ai pas vue, et j'ai cru que ça enlevait l'erreur.

    ah!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    $ python3 -m sysconfig 2>/dev/null | head -n 14
    Platform: "linux-x86_64"
    Python version: "3.12"
    Current installation scheme: "posix_prefix"
     
    Paths: 
            data = "/usr"
            include = "/usr/include/python3.12"
            platinclude = "/usr/include/python3.12"
            platlib = "/usr/lib/python3.12/site-packages"
            platstdlib = "/usr/lib/python3.12"
            purelib = "/usr/lib/python3.12/site-packages"
            scripts = "/usr/bin"
            stdlib = "/usr/lib/python3.12"
     
    $
    KISS! puisque c'est une "erreur" ->poubelle.


    non mais !
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  13. #13
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2011
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2011
    Messages : 46
    Points : 18
    Points
    18
    Par défaut
    Bonjour Papajoker et N_Bah,

    Je suis désolé du délai, je voulais tester plusieurs options avant de redemander de l'aide. J'ai essayé plusieurs choses, mais cela ne semble pas fonctionner. J'ai tester le .sh bateau de Papajoker et voici le retour :

    root@ubuntu:/home/iot_devices# source bateau.sh
    Avant virtuel env
    Platform: "linux-x86_64"
    Python version: "3.12"
    Current installation scheme: "posix_local"

    Paths:
    data = "/usr/local"
    include = "/usr/include/python3.12"
    platinclude = "/usr/include/python3.12"
    platlib = "/usr/local/lib/python3.12/dist-packages"
    platstdlib = "/usr/lib/python3.12"
    purelib = "/usr/local/lib/python3.12/dist-packages"
    scripts = "/usr/local/bin"
    stdlib = "/usr/lib/python3.12"

    -bash
    dirname: invalid option -- 'b'
    Try 'dirname --help' for more information.
    Directory:
    /home/iot_devices
    -bash: /.venv/bin/activate: No such file or directory

    Dans virtuel env
    python3: /usr/bin/python3 /usr/lib/python3 /etc/python3 /usr/share/python3 /usr/share/man/man1/python3.1.gz
    Current installation scheme: "posix_local"
    data = "/usr/local"
    platlib = "/usr/local/lib/python3.12/dist-packages"
    platstdlib = "/usr/lib/python3.12"

    RUN PYTHON SCRIPT ...
    python3: can't open file '/UTILISATEURS.py': [Errno 2] No such file or directory

    Sortie du virtuel env...
    deactivate: command not found
    Cela veut dire quoi ?
    Je ne suis bas dans le bon répertoire ?

    /.venv/bin/activate: No such file or directory
    pourtant
    root@ubuntu:/home/iot_devices# source .venv/bin/activate
    (.venv) root@ubuntu:/home/iot_devices#

    Merci

  14. #14
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 584
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 584
    Points : 19 461
    Points
    19 461
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dirname: invalid option -- 'b'
    peut-être une coquille dans ton script...

    modifie current ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    current=$(set -x; dirname "$0"; set +x)
    et montre-nous la sortie du script, pour qu'on voit ce qui est passé à dirname.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  15. #15
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2011
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2011
    Messages : 46
    Points : 18
    Points
    18
    Par défaut
    Je viens de faire les modifications. J'ai ajouté des petites lignes pour moi-même pour mieux suivre et comprendre.


    #!/usr/bin/env bash

    echo "Avant virtuel env"
    echo "$(python3 -m sysconfig --)" | head -n14 # pas beau ! sinon "| head -n14" est pris comme paramètre à python et non à bash
    echo "-----------"
    echo "$0"
    current=$(set -x; dirname "$0"; set +x)
    echo "Directory: $current"
    #cd "$current=${0%/*}" # optionel ?
    pwd
    echo "-----------"
    source "$current/.venv/bin/activate"
    echo
    echo "Dans virtuel env"
    whereis python3
    env | grep -E 'VIRTUAL_ENV'
    python3 -m sysconfig | grep -E 'data =|scheme|platlib |platstdlib'
    echo "------------"

    echo
    echo "RUN PYTHON SCRIPT ..."
    python3 "$current/UTILISATEURS.py"
    echo "------------"

    echo
    echo "Sortie du virtuel env..."
    deactivate # non utile
    env | grep -E 'VIRTUAL_ENV' # vide

    voici le résultat :

    root@ubuntu:/home/iot_devices# source bateau.sh
    Avant virtuel env
    Platform: "linux-x86_64"
    Python version: "3.12"
    Current installation scheme: "posix_local"

    Paths:
    data = "/usr/local"
    include = "/usr/include/python3.12"
    platinclude = "/usr/include/python3.12"
    platlib = "/usr/local/lib/python3.12/dist-packages"
    platstdlib = "/usr/lib/python3.12"
    purelib = "/usr/local/lib/python3.12/dist-packages"
    scripts = "/usr/local/bin"
    stdlib = "/usr/lib/python3.12"

    -----------
    -bash
    +++ dirname -bash
    dirname: invalid option -- 'b'
    Try 'dirname --help' for more information.
    +++ set +x
    Directory:
    /home/iot_devices
    -----------
    -bash: /.venv/bin/activate: No such file or directory

    Dans virtuel env
    python3: /usr/bin/python3 /usr/lib/python3 /etc/python3 /usr/share/python3 /usr/share/man/man1/python3.1.gz
    Current installation scheme: "posix_local"
    data = "/usr/local"
    platlib = "/usr/local/lib/python3.12/dist-packages"
    platstdlib = "/usr/lib/python3.12"
    ------------

    RUN PYTHON SCRIPT ...
    python3: can't open file '/UTILISATEURS.py': [Errno 2] No such file or directory
    ------------

    Sortie du virtuel env...
    deactivate: command not found
    Concernant le code, celui-ci vient de PapaJoker. Je n'ai pas assez de connaissance en Linux pour y arriver.

    Merci beaucoup

  16. #16
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 584
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 584
    Points : 19 461
    Points
    19 461
    Par défaut
    je ne suis pas sûr qu'il faille sourcer le script (l'environnement virtuel y est configuré, et la commande voulue y est exécutée); c'est l'origine de l'erreur.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  17. #17
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2011
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2011
    Messages : 46
    Points : 18
    Points
    18
    Par défaut
    Je viens de modifier .sh en enlevant $current. Cela fonctionne maintenant

    #!/usr/bin/env bash

    echo "Avant virtuel env"
    echo "$(python3 -m sysconfig --)" | head -n14 # pas beau ! sinon "| head -n14" est pris comme paramètre à python et non à bash
    echo "-----------"
    echo "$0"
    current=$(set -x; dirname "$0"; set +x)
    echo "Directory: $current"
    #cd "$current=${0%/*}" # optionel ?
    pwd
    echo "-----------"
    source ".venv/bin/activate"
    echo
    echo "Dans virtuel env"
    whereis python3
    env | grep -E 'VIRTUAL_ENV'
    python3 -m sysconfig | grep -E 'data =|scheme|platlib |platstdlib'
    echo "------------"

    echo
    echo "RUN PYTHON SCRIPT ..."
    python3 "UTILISATEURS.py"
    echo "------------"

    echo
    echo "Sortie du virtuel env..."
    deactivate # non utile
    env | grep -E 'VIRTUAL_ENV' # vide
    Si je fais cela, le script démarre.
    root@ubuntu:/home/iot_devices# source bateau.sh

    J'ai modifié crontab. J'ai testé plusieurs configuration trouvé dans des exemples sur internet, mais le script n'est pas démarré :
    test 1
    @reboot cd /home/iot_devices && sh bateau.sh

    test 2
    @reboot /home/iot_devices/bateau.sh

    test 3
    @reboot source /home/iot_devices/bateau.sh
    une fois logger, si je fais cela, le script démarre. Mais la même ligne de commande dans crontab, cela ne fonctionne pas
    root@ubuntu:~# cd /home/iot_devices && source bateau.sh
    As tu une idée pourquoi ?

  18. #18
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 201
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 201
    Points : 4 665
    Points
    4 665
    Par défaut
    @ N_BaH
    Citation Envoyé par Gregory_007 Voir le message
    -bash
    +++ dirname -bash
    dirname: invalid option -- 'b'
    ici, c'est la variable $0 qui n'est pas bonne (== -bash) ???
    car le script est lancé par cron

    donc le script ne peut localiser le bon répertoire et "sourcer" le fichier

    Citation Envoyé par Gregory_007 Voir le message
    Je viens de modifier .sh en enlevant $current. Cela fonctionne maintenant
    c'est un peu la blague Tu retournes en fait volontairement au tout début (script qui ne tourne que dans son répertoire)

    si tu inséres cette ligne au tout début (ligne 2), que retourne cette ligne chez toi si script lancé via cron ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo "BASH_SOURCE = ${BASH_SOURCE[@]}"
    $moi= ( !== ) ? : ;

  19. #19
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2011
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2011
    Messages : 46
    Points : 18
    Points
    18
    Par défaut
    Désolé papajoker, je ne suis pas sur d'avoir compris ce que tu me demande.

    J'ai ajouté la ligne
    echo "BASH_SOURCE = ${BASH_SOURCE[@]}"
    dans bateau.sh

    Si je redémarre, je ne vois rien. Je suis en SSH

    Si je fais
    root@ubuntu:/home/iot_devices# source bateau.sh

    BASH_SOURCE = bateau.sh
    Avant virtuel env
    Platform: "linux-x86_64"
    Python version: "3.12"
    Current installation scheme: "venv"

    Paths:
    data = "/home/iot_devices/.venv"
    include = "/usr/include/python3.12"
    platinclude = "/usr/include/python3.12"
    platlib = "/home/iot_devices/.venv/lib/python3.12/site-packages"
    platstdlib = "/home/iot_devices/.venv/lib/python3.12"
    purelib = "/home/iot_devices/.venv/lib/python3.12/site-packages"
    scripts = "/home/iot_devices/.venv/bin"
    stdlib = "/usr/lib/python3.12"

    -----------
    -bash
    +++ dirname -bash
    dirname: invalid option -- 'b'
    Try 'dirname --help' for more information.
    +++ set +x
    Directory:
    /home/iot_devices
    -----------

    Dans virtuel env
    python3: /usr/bin/python3 /usr/lib/python3 /etc/python3 /usr/share/python3 /home/iot_devices/.venv/bin/python3 /usr/share/man/man1/python3.1.gz
    VIRTUAL_ENV=/home/iot_devices/.venv
    VIRTUAL_ENV_PROMPT=(.venv)
    Current installation scheme: "venv"
    data = "/home/iot_devices/.venv"
    platlib = "/home/iot_devices/.venv/lib/python3.12/site-packages"
    platstdlib = "/home/iot_devices/.venv/lib/python3.12"
    ------------

    RUN PYTHON SCRIPT ...
    CONNEXION à la base de données réussi
    * Serving Flask app 'UTILISATEURS'
    * Debug mode: off
    WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
    * Running on all addresses (0.0.0.0)
    * Running on http://127.0.0.1:5000
    * Running on http://xxxxxxxxxxxxxx
    Press CTRL+C to quit
    C'est ce que tu voulais que je fasse ?

  20. #20
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 584
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 584
    Points : 19 461
    Points
    19 461
    Par défaut
    @papajoker:
    le problème n'est pas le source dans le script, c'est que le script est sourcé.
    donc, $0 retourne -bash au lieu de /chemin/vers/bateau.sh
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 6
    Dernier message: 27/03/2023, 17h31
  2. Comment activer environnement virtuel dans VS Code
    Par OZ1977 dans le forum Visual Studio
    Réponses: 1
    Dernier message: 13/04/2021, 14h16
  3. Réponses: 25
    Dernier message: 02/06/2010, 10h29
  4. Réponses: 0
    Dernier message: 10/05/2010, 13h19

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