[RESOLU] Variable dans commande call

Python est le langage de prédilection du Raspberry Pi

Modérateurs : Francois, Manfraid

Répondre
jule1986
Messages : 8
Enregistré le : mer. 28 oct. 2015 10:28

[RESOLU] Variable dans commande call

Message par jule1986 » dim. 22 mai 2016 11:36

Bonjour a tous,
Je viens chercher de l'aide car je n'arrive pas a faire ce que je veux.
J'ai un script qui surveille un encodeur rotatif (je veux faire un réglage de volume).
Et je souhaiterais ajouter une variable dans la commande Call de Subprocess.
Je vous met les lignes qui me pose problème.

Code : Tout sélectionner

while True:
    RE1.read()                                                  # Read the encoder    
    if Position <> RE1.Position:                                # has the position changed?
	#print RE1.Position                                      # Yes: so print new value
		call(["amixer", "sset", "Master", "50"])
		Position = RE1.Position  
Dans la commande Call je souhaiterais remplacer le "50" par ma variable RE1.Position mais je ne sais pas comment mettre en forme....
Merci d'avance pour vos réponse.
Julien
Modifié en dernier par jule1986 le mar. 24 mai 2016 09:48, modifié 1 fois.

Avatar du membre
vague nerd
Modérateur
Messages : 1473
Enregistré le : mar. 14 oct. 2014 11:42
Localisation : France !

Re: Variable dans commande call

Message par vague nerd » dim. 22 mai 2016 12:02

Bonjour.

Avez vous essayé

Code : Tout sélectionner

call(["amixer", "sset", "Master", RE1.Position])
ou

Code : Tout sélectionner

call(["amixer", "sset", "Master", int(RE1.Position)])
?

Si RE1.Position est un entier, la première commande semble la bonne, si RE1.Position est une string, la seconde semble la bonne.
Cdt.
Cordialement,

Vague Nerd

jule1986
Messages : 8
Enregistré le : mer. 28 oct. 2015 10:28

Re: Variable dans commande call

Message par jule1986 » dim. 22 mai 2016 12:45

Merci beaucoup, je teste ça rapidement et je vous tiens au courant.

jule1986
Messages : 8
Enregistré le : mer. 28 oct. 2015 10:28

Re: Variable dans commande call

Message par jule1986 » dim. 22 mai 2016 18:22

Bon et bien ça ne fonctionne pas (avec les 2 versions), j'ai l'erreur suivante :

Code : Tout sélectionner

Traceback (most recent call last):
  File "rotary.py", line 75, in <module>
    call(["amixer", "sset", "Master", RE1.Position])
  File "/usr/lib/python2.7/subprocess.py", line 522, in call
    return Popen(*popenargs, **kwargs).wait()
  File "/usr/lib/python2.7/subprocess.py", line 710, in __init__
    errread, errwrite)
  File "/usr/lib/python2.7/subprocess.py", line 1335, in _execute_child
    raise child_exception
TypeError: execv() arg 2 must contain only strings
Voici le code complet (si ça peux aider...) :

Code : Tout sélectionner

#!/usr/local/bin/python
# m0xpd
# shack.nasties 'at Gee Male dot com'
import RPi.GPIO as GPIO
# setup GPIO options...
GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)
#import urllib
from subprocess import call


class RotaryEnc:
    'Base Class for Rotary Encoder on the RPi GPIO Pins'
    
    def __init__(self,PinA,PinB,button,Position,REmin,REmax,inc):
        
        self.PinA = PinA                                        # GPIO Pin for encoder PinA
        self.PinB = PinB                                        # GPIO Pin for encoder PinB
        self.button = button                                    # GPIO Pin for encoder push button
        self.Position = Position                                # encoder 'position'
        self.min = REmin                                        # Max value
        self.max = REmax                                        # Min value
        self.inc = inc                                          # increment        
        self.old_button = 1                                     # start value for previous button state
        self.oldPinA = 1                                        # start value for previous PinA state
        self.button_release = 0                                 # initialise outputs
        self.button_down = 0                                    # initialise outputs        
        GPIO.setup(self.PinA, GPIO.IN)                          # setup IO bits...
        GPIO.setup(self.PinB, GPIO.IN)                          #
        GPIO.setup(self.button, GPIO.IN)                        #
                                                                #
    def read(self):                                             # Function to Read encoder...
        encoderPinA=GPIO.input(self.PinA)                       # get inputs...
        encoderPinB=GPIO.input(self.PinB)                       #
        if encoderPinA and not self.oldPinA:                    # Transition on PinA?
                if not encoderPinB:                             #    Yes: is PinB High?
                        self.Position=self.Position+self.inc    #        No - so we're going clockwise
                        if self.Position > self.max:            #        limit maximum value
                                self.Position = self.max        #
                                                                #
                else:                                           #
                                                                #           
                        self.Position=self.Position-self.inc    #        Yes - so we're going anti-clockwise
                        if self.Position < self.min:            #        limit minimum value
                                self.Position = self.min        #     
        self.oldPinA=encoderPinA                                #    No: just save current PinA state for next time        
                                                                #
    def read_button(self):                                      # Function to Read encoder button...
        button=GPIO.input(self.button)                          # get input...
        if button and not self.old_button:                      # 'Upward' transition on button?
            self.button_release=1                               #      Yes - so set release output
        else:                                                   #    
            self.button_release=0                               #      No - so clear it
        if not button and self.old_button:                      # 'Downward' transition on button?
            self.button_down = 1                                #       Yes - so set 'down' button
        else:                                                   #                                                
            self.button_down = 0                                #       No - so clear it
        self.old_button=button                                  # Save current button state for next time

# -------------------------------------------------------------------------------------------------------------------
# Here's a simple example of how to use the RotaryEnc Class ...
#
# Set up Rotary Encoder...
#  format is : RotaryEnc(PinA,PinB,button,Position,REmin,REmax,inc):
Position = 1                                                    # Position is also used as a variable
RE1 = RotaryEnc(38,37,36,Position,0,248,15)                       # Instatiate the encoder                         


# Main Operating Loop...
while True:
    RE1.read()                                                  # Read the encoder    
    if Position <> RE1.Position:                                # has the position changed?
	#urllib.urlopen('http://192.168.0.32:9001/status.html?p0=mixer&p1=volume&p2=+5&player=F4:F2:6D:16:FB:B2')
	#print RE1.Position                                      # Yes: so print new value
	call(["amixer", "sset", "Master", RE1.Position])
	Position = RE1.Position                                 #      and update it             
    RE1.read_button()                                           # Read the button  
    if RE1.button_down:                                         # Has it been pressed?
        print 'Button Pressed'                                  # Yes: so print a message
    if RE1.button_release:                                      # Has it been released
        print 'Button Released'                                 # Yes: so print a message

Avatar du membre
vague nerd
Modérateur
Messages : 1473
Enregistré le : mar. 14 oct. 2014 11:42
Localisation : France !

Re: Variable dans commande call

Message par vague nerd » dim. 22 mai 2016 20:31

Ok, ben ça semble être le contraire, du coup. Les paramètres doivent être passés en chaine de caractère. Du coup :

Code : Tout sélectionner

call(["amixer", "sset", "Master", str(RE1.Position]))
car RE1.Position doit être un entier.
Cdt.
EDIT: je viens de jeter un oeil au code. Ca doit ête ça.
Cordialement,

Vague Nerd

jule1986
Messages : 8
Enregistré le : mer. 28 oct. 2015 10:28

Re: Variable dans commande call

Message par jule1986 » mar. 24 mai 2016 08:35

Impeccable merci beaucoup.

Avatar du membre
vague nerd
Modérateur
Messages : 1473
Enregistré le : mar. 14 oct. 2014 11:42
Localisation : France !

Re: Variable dans commande call

Message par vague nerd » mar. 24 mai 2016 09:00

Avec plaisir. Python est fortement typé. Cela implique qu'il faut souvent convertir des types de données dans d'autre, notamment avec int(), str()...

Si vous estimez que votre problème est résolu, merci d'ajouter [RESOLU] au début du titre du sujet.
Pour ce faire, visualiser le premier Post que vous avez réalisé, cliquez sur "Editer", et ajouter [RESOLU] devant le titre, sans l'effacer.

Cela permet que le message soit tout de suite identifié comme ayant eu une réponse correspondant à la demande.
Ainsi, les visiteurs en sont informés, aussi bien lors d'une recherche sur le forum qu'au travers des moteurs de recherche.

Merci d'avance !
Cordialement.
Cordialement,

Vague Nerd

Répondre

Retourner vers « Python »