2017-10-07 8 views
-1

Quand je suis loin de ma montagne, je surveille mon système photo-voltaïque avec Raspberry Pi et un petit script python pour lire les données et les envoyer sur ma page web toutes les heures. Cela est lancé par un interrupteur électro-mécanique qui allume les choses pendant 15 minutes. Mais pendant cette période, le script peut s'exécuter deux fois, ce que je voudrais éviter car le résultat est désordonné (lsdx.eu/GPV_ZSDX).Arrêtez raspbian/debian depuis python

Je veux ajouter une ligne à la fin du script pour l'arrêter une fois qu'il a fonctionné une fois et peut-être arrêter aussi raspbian pour une sortie propre avant que l'alimentation soit coupée. - "exit" ne quitte qu'une boucle mais le script est toujours en cours - bien sûr Ctrl + C ne fera pas comme je suis absent; Impossible de trouver une astuce dans ces messages hautement techniques dans StackOverflow ou dans l'aide de Rasbian non plus.

Un conseil? Merci

+1

Ce serait bien de votre part de nous montrer ce que vous avez essayé jusqu'ici? Pourquoi ça n'a pas marché Venir à SO juste pour obtenir quelqu'un d'autre pour résoudre les problèmes sans vous essayer d'abord est, bien ce n'est pas très agréable. Par exemple, si vous voulez arrêter votre RPi, pourquoi ne pas essayer 'os.system ('shutdown -hP now')' ou quelque chose de similaire? – Torxed

+0

Vous devriez poser une question spécifique pour un problème de programmation particulier. Puisque Stack Overflow cache la raison Close de vous: * "Les questions nous demandant de recommander ou de trouver un livre, un outil, une bibliothèque de logiciels, un tutoriel ou autre ressource hors site sont hors sujet pour Stack Overflow car elles ont tendance à attirer les réponses Décrivez plutôt le problème et ce qui a été fait jusqu'à présent pour le résoudre. "* – jww

Répondre

0

La commande exit() doit quitter le programme (break est l'instruction qui quittera une boucle). Quel comportement voyez-vous?

Pour arrêter, essayez:

python3:

from subprocess import run 
run('poweroff', shell=True) 

python2:

from subprocess import call 
call('poweroff') 

Note: poweroff peut être appelé arrêt sur votre système et peut nécessiter la ligne de commande supplémentaire passe à forcer un arrêt (si nécessaire).

0

Pour votre cas, la structure du script python en fonction en utilisant la construction suivante:

def read_data(): 
    data_reading_voodo 
    return message_to_be_sent 

def send_message(msg): 
    perform_message_sending_voodo 
    log_message_sending_voodoo_success_or_failure 
    return None 

if __name__ == "__main__": 
    msg = read_data() 
    send_message(msg) 

structuré comme celui-ci, le script python devrait sortir après l'exécution.

Créez ensuite une coquille sript comme suit (en supposant bash et python, mais modifier en fonction de votre utilisation)

#!/bin/bash 
python -m /path/to/your/voodo/script && sudo shutdown -h 6 

Le sudo shudown -h 6 arrête le 6 minutes après Raspberry Pi le script est exécuté. Cette option vous permet de supprimer le script si vous voulez arrêter le cycle de redémarrage.

Faire l'exécutable script shell: chmod 755 run_py_script_then_set_shutdown voir man chmod pour plus de détails

Maintenant, créez une tâche cron pour exécuter run_py_script_then_set_shutdown au démarrage.

crontab -e Ensuite, ajoutez la ligne suivante à votre crontab

@reboot /path/to/your/shell/script 

Enregistrer, redémarrez le pi, et vous avez terminé. Chaque fois que le RPC démarre, le script Python devrait s'exécuter et quitter. Ensuite, le rpi s'arrêtera 6 minutes après la sortie du script python.

Vous pouvez (devriez) ajuster les 6 minutes à vos besoins.

0

Merci pour toutes ces réponses qui m'aident à apprendre Pyth et Deb. J'ai finalement opté pour une solution très simple à la fin du script: import os os.system ('arrêt sudo maintenant)

Mais je garde à l'esprit ces autres solutions Merci encore, Lionel