Page 1 sur 1
[RESOLU] Variable dans commande call
Posté : dim. 22 mai 2016 11:36
par jule1986
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
Re: Variable dans commande call
Posté : dim. 22 mai 2016 12:02
par vague nerd
Bonjour.
Avez vous essayé
ou
?
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.
Re: Variable dans commande call
Posté : dim. 22 mai 2016 12:45
par jule1986
Merci beaucoup, je teste ça rapidement et je vous tiens au courant.
Re: Variable dans commande call
Posté : dim. 22 mai 2016 18:22
par jule1986
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
Re: Variable dans commande call
Posté : dim. 22 mai 2016 20:31
par vague nerd
Ok, ben ça semble être le contraire, du coup. Les paramètres doivent être passés en chaine de caractère. Du coup :
car RE1.Position doit être un entier.
Cdt.
EDIT: je viens de jeter un oeil au code. Ca doit ête ça.
Re: Variable dans commande call
Posté : mar. 24 mai 2016 08:35
par jule1986
Impeccable merci beaucoup.
Re: Variable dans commande call
Posté : mar. 24 mai 2016 09:00
par vague nerd
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.