2017-10-15 7 views
0

J'utilise un Raspberry Pi pour exécuter un script python qui joue un son (en utilisant pygame) et utilise le GPIO embarqué. Je sais que pour accéder au GPIO le script doit être exécuté en utilisant sudo, mais j'ai remarqué qu'en utilisant sudo python myscript.py le code s'exécute, mais ne joue pas le son. En utilisant python myscript.py le son joue, mais évidemment pas le GPIO. J'ai essayé de changer où je référence le fichier audio à un chemin absolu en vain, je ne suis pas trop familier avec les rouages ​​internes de sudo, quelqu'un peut-il faire la lumière sur ce problème?L'exécution de Python à l'aide de sudo échoue à lire le fichier son

import pygame 
pygame.init() 
pygame.mixer.music.load("alert.wav") 
pygame.mixer.music.play() 
while pygame.mixer.music.get_busy() == True: 
    continue 

    GPIO.output(16,True) 
    GPIO.output(18,True) 

Sortie de printenv

LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36: 
SSH_CONNECTION=192.168.0.114 64152 192.168.0.196 22 
LANG=en_US.UTF-8 
INFINALITY_FT_CHROMEOS_STYLE_SHARPENING_STRENGTH=0 
INFINALITY_FT_AUTOHINT_INCREASE_GLYPH_HEIGHTS=true 
INFINALITY_FT_CONTRAST=0 
INFINALITY_FT_STEM_FITTING_STRENGTH=25 
INFINALITY_FT_GLOBAL_EMBOLDEN_X_VALUE=0 
XDG_SESSION_ID=c5 
USER=pi 
INFINALITY_FT_AUTOHINT_SNAP_STEM_HEIGHT=100 
INFINALITY_FT_GRAYSCALE_FILTER_STRENGTH=0 
INFINALITY_FT_GAMMA_CORRECTION=0 100 
PWD=/home/pi 
HOME=/home/pi 
TEXTDOMAIN=Linux-PAM 
SSH_CLIENT=192.168.0.114 64152 22 
INFINALITY_FT_WINDOWS_STYLE_SHARPENING_STRENGTH=10 
SSH_TTY=/dev/pts/1 
INFINALITY_FT_BRIGHTNESS=0 
MAIL=/var/mail/pi 
TERM=xterm 
SHELL=/bin/bash 
INFINALITY_FT_USE_VARIOUS_TWEAKS=true 
SHLVL=1 
INFINALITY_FT_BOLD_EMBOLDEN_Y_VALUE=0 
INFINALITY_FT_GLOBAL_EMBOLDEN_Y_VALUE=0 
INFINALITY_FT_AUTOHINT_HORIZONTAL_STEM_DARKEN_STRENGTH=10 
LOGNAME=pi 
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus 
XDG_RUNTIME_DIR=/run/user/1000 
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games 
INFINALITY_FT_FILTER_PARAMS=11 22 38 22 11 
INFINALITY_FT_USE_KNOWN_SETTINGS_ON_SELECTED_FONTS=true 
INFINALITY_FT_STEM_SNAPPING_SLIDING_SCALE=40 
INFINALITY_FT_STEM_ALIGNMENT_STRENGTH=25 
INFINALITY_FT_BOLD_EMBOLDEN_X_VALUE=0 
INFINALITY_FT_AUTOHINT_VERTICAL_STEM_DARKEN_STRENGTH=25 
INFINALITY_FT_FRINGE_FILTER_STRENGTH=0 
_=/usr/bin/printenv 

Sortie de sudo printenv

LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36: 
LANG=en_US.UTF-8 
TERM=xterm 
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin 
MAIL=/var/mail/root 
LOGNAME=root 
USER=root 
USERNAME=root 
HOME=/root 
SHELL=/bin/bash 
SUDO_COMMAND=/usr/bin/printenv 
SUDO_USER=pi 
SUDO_UID=1000 
SUDO_GID=1000 
+0

Habituellement, cela se produit parce que lorsque vous exécutez la commande avec sudo, les variables d'environnement sont différentes, et sur la base de ces quelque chose ne peut pas être défini que vous devez le faire fonctionner. Faire 'printenv' depuis la ligne de commande puis 'sudo printenv' vous aidera à voir ce qui est différent. L'ajout de cette sortie à votre question serait utile. –

+1

Au lieu d'utiliser 'sudo', vous devriez fixer l'autorisation aux ports GPIO. –

+0

@JeffRichards J'ai ajouté la sortie des deux commandes 'printenv'. J'espère que cela vous aide à m'aider! – Exeleon

Répondre

0

Une autre solution qui ne nécessite pas sudo, serait de créer et d'utiliser un groupe gpio. Sur raspbian, vous pouvez créer un nouveau groupe avec groupadd.

Affectez ce groupe aux périphériques gpio avec accès en lecture/écriture de groupe pour ce groupe. Vous pouvez le faire avec chown, mais cela ne durera pas après un redémarrage. Sur Raspbian cela est fait avec en permanence une règle udev. Voir par exemple this example.

Ajoutez ensuite l'ID utilisateur qui exécute les programmes Python à ce groupe. Sur Raspbian ceci est fait avec adduser.

Notez que si vous n'exécutez pas la distribution raspbian, les noms des commandes concernées peuvent être différents.

Avec cette configuration, tous les utilisateurs faisant partie du groupe gpio peuvent accéder aux périphériques GPIO.