TODOPIC

Lenguajes de programación para PC => Python => Mensaje iniciado por: Miquel_S en 24 de Julio de 2016, 05:54:32

Título: Dudas con escribir codigo
Publicado por: Miquel_S en 24 de Julio de 2016, 05:54:32
Abro este apartado para dudas en la manera de escribir instrucciones y así no mezclar temas.
Título: Re:Dudas con escribir codigo
Publicado por: Miquel_S en 24 de Julio de 2016, 06:19:25
Hola KILLERJC lo que comentas al final de este post http://www.todopic.com.ar/foros/index.php?topic=46580.msg389282;topicseen#msg389282 lo tengo mas o menos claro, la duda que tengo es que si escribo
Código: Python
  1. valor = 2563
y despues en la otra instrucción pongo
Código: Python
  1. str(valor)
me imprime el entero entre comillas simples como si de un string se tratara, pero con
Código: Python
  1. print(("Valor: " + str(valor)))
me lo imprime sin ningún tipo de comillas y no se si es correcto, de todos modos si después de imprimir en pantalla el valor hago type(valor) en los dos casos me dice que es un int.
En el caso del valor entre comillas al hacer
Código: Python
  1. type(valor)
¿no debería de decirme que valor ahora es de tipo string?

Gracias y perdón por preguntar tanto.
Título: Re:Dudas con escribir codigo
Publicado por: KILLERJC en 24 de Julio de 2016, 12:13:50
Código: Python
  1. >>> valor = 1234
  2. >>> str(valor)
  3. '1234'
  4. >>> print(("Valor: " + str(valor)))
  5. Valor: 1234
  6. >>> type(valor)
  7. <class 'int'>
  8. >>> type(str(valor))
  9. <class 'str'>
  10. >>> type(("Valor: " + str(valor)))
  11. <class 'str'>
  12. >>> "Valor: " + str(valor)
  13. 'Valor: 1234'

Valor es un entero... el hacer str(valor) NO convierte a valor en un string, pensalo como en una funcion que vos le pasas un valor numerico y te devuelve un string. Por lo tanto valor SIGUE siendo un entero.

espero que con los ejemplos de arriba te des cuenta que todos los demas son strings. ya que los pasas por el str().

Lo que no te imprima las comillas es por que vos estas pidiendo que no te imprima comillas con el Printf, es decir no tenes puestas comillas. Observaras cuando hice:

Código: Python
  1. "Valor :" + str(valor)

el resultado es con comillas pero al hacerlo con el printf no, Por que vos no estas pidiendo esto: "\'Valor: " +str(valor) + "\'"
Espero hacerme entender.
Título: Re:Dudas con escribir codigo
Publicado por: Miquel_S en 24 de Julio de 2016, 12:20:31
Gracias KILLERJC ya entiendo la diferencia.
Título: Re:Dudas con escribir codigo
Publicado por: tsk en 24 de Julio de 2016, 21:53:22
print esta diseñado para imprimir a pantalla
str NO

Al ejecutar str(valor) dentro de la consola de python este retorna en pantalla el resultado de convertir Valor a string. El objetivo es que puedas ver/inspeccionar el resultado y/o el contenido de una función o variable en la consola de python de forma interactiva.

Si realizas un programa en python que contenga

Código: [Seleccionar]
Valor = 1234
str(1234)
print(("Valor: %s")%Valor)
print("Valor: "+str(Valor))

Lo guardas en un archivo llamado prueba.py y lo ejecutas desde la terminal con

Código: [Seleccionar]
python prueba.py

Los únicos que te dará salida son los print, el otro sólo dará salida cuando estés en la consola de python

Otro ejemplo donde se aprecia claramente la diferencia entre inspeccionar el contenido e imprimir a pantalla es el siguiente:

Código: [Seleccionar]
import os
os.__doc__
print(os.__doc__)

La salida del primer comando va a ser

Código: [Seleccionar]
>>> os.__doc__
"OS routines for NT or Posix depending on what system we're on.\n\nThis exports:\n  - all functions from posix, nt or ce, e.g. unlink, stat, etc.\n  - os.path is either posixpath or ntpath\n  - os.name is either 'posix', 'nt' or 'ce'.\n  - os.curdir is a string representing the current directory ('.' or ':')\n  - os.pardir is a string representing the parent directory ('..' or '::')\n  - os.sep is the (or a most common) pathname separator ('/' or ':' or '\\\\')\n  - os.extsep is the extension separator (always '.')\n  - os.altsep is the alternate pathname separator (None or '/')\n  - os.pathsep is the component separator used in $PATH etc\n  - os.linesep is the line separator in text files ('\\r' or '\\n' or '\\r\\n')\n  - os.defpath is the default search path for executables\n  - os.devnull is the file path of the null device ('/dev/null', etc.)\n\nPrograms that import and use 'os' stand a better chance of being\nportable between different platforms.  Of course, they must then\nonly use functions that are defined by all platforms (e.g., unlink\nand opendir), and leave all pathname manipulation to os.path\n(e.g., split and join).\n"

Puedes observar que no formatea la salida, puedes ver los saltos de línea  y demás caracteres de escape

La salida del segundo

Código: [Seleccionar]
>>> print(os.__doc__₎
OS routines for NT or Posix depending on what system we're on.

This exports:
  - all functions from posix, nt or ce, e.g. unlink, stat, etc.
  - os.path is either posixpath or ntpath
  - os.name is either 'posix', 'nt' or 'ce'.
  - os.curdir is a string representing the current directory ('.' or ':')
  - os.pardir is a string representing the parent directory ('..' or '::')
  - os.sep is the (or a most common) pathname separator ('/' or ':' or '\\')
  - os.extsep is the extension separator (always '.')
  - os.altsep is the alternate pathname separator (None or '/')
  - os.pathsep is the component separator used in $PATH etc
  - os.linesep is the line separator in text files ('\r' or '\n' or '\r\n')
  - os.defpath is the default search path for executables
  - os.devnull is the file path of the null device ('/dev/null', etc.)

Programs that import and use 'os' stand a better chance of being
portable between different platforms.  Of course, they must then
only use functions that are defined by all platforms (e.g., unlink
and opendir), and leave all pathname manipulation to os.path
(e.g., split and join).
Título: Re:Dudas con escribir codigo
Publicado por: Miquel_S en 25 de Julio de 2016, 06:45:37
Gracias tsk entre esto y lo demás ya tengo para estrujarme la cabeza.

Miquel_S
Título: Re:Dudas con escribir codigo
Publicado por: Miquel_S en 02 de Agosto de 2016, 11:49:33
Me surge una duda con lo que hace esta instrucción:
Código: Python
  1. >>> sys.path = ['..'] + sys.path
despues de ella he probado con hacer un
Código: Python
  1. >>> print(sys.path)
y me imprime en pantalla
Código: Python
  1. ['..', '', '/usr/lib/python35.zip', '/usr/lib/python3.5', '/usr/lib/python3.5/plat-x86_64-linux-gnu', '/usr/lib/python3.5/lib-dynload', '/usr/local/lib/python3.5/dist-packages', '/usr/lib/python3/dist-packages']
lo que parece ser la ruta donde están instaladas las librerías que usa python, de ser así ¿Seria correcto poner esta instrucción en todos los programas o por el contrario no es esto lo que esta haciendo dicha instrucción?

Gracias.
Título: Re:Dudas con escribir codigo
Publicado por: tsk en 02 de Agosto de 2016, 14:35:20
sys.path contiene las rutas donde python irá a buscar los módulos que importes con import.

Por lo general no es común que uses el sys.path, el mismo sistema de encarga de ubicar los módulos que se importan y que se encuentran dentro del árbol de directorios de tu proyecto con tan sólo añadir un archivo llamado __init__.py dentro de cada directorio.

al tu añadir el directorio .. a tu ruta este buscará también los módulos un directorio atrás de donde tu programa se esté ejecutando actualmente, no con respecto al archivo .py.

Por ejemplo:

Código: [Seleccionar]
import os
import sys


sys.path.append('..')

print(os.listdir(sys.path[-1]))

Código: [Seleccionar]
$ pwd
/home/alex/proyectos/python/tests
$ python3 test1.py
['tests', 'ANU', 'hashtables_tests']
$ cd ..
$ python3 tests/test1.py
['wimdAPI', 'MicrochipData', 'RaspberryPi', 'arm_ide', 'au', '.gitignore', 'Cordova', 'MSP340', 'Electron', 'nodejs', 'repuve', 'Pomodoro', 'cloud', 'python', 'RecyBot', 'electron', 'libs', 'microcontrollers', 'wave', 'RealTime', 'mosquitto', 'MonitorS', '.git', '8051', 'ghdl', 'games', 'TestM', 'Ada', 'OpenERP', 'Odoo', 'esp8266', 'ARMIDE', 'PCBExample', 'VHDL', 'BMLP', 'TivaC', 'FacturaSAT']

Como puedes observar, no es realmente útil para fines prácticos agregar sólo el ..

Probablemente lo que quieres hacer es añadir al sys.path un directorio que se encuentra por encima de tu archivo .py

Para ello puedes obtener la ruta de tu actual archivo, y con respecto a esa ruta añadir el .. a tu sys.path

Código: [Seleccionar]
import os
import sys


#sys.path.append('..')

#print(os.listdir(sys.path[-1]))

#print(sys.path[-1])

print(__file__)
print(os.path.abspath(__file__))

Código: [Seleccionar]
$ python3 tests/test1.py
tests/test1.py
$ cd tests
$ python3 test1.py
test1.py
/home/alex/proyectos/python/tests/test1.py

Y extraemos sólo le nombre del directorio donde el archivo test1.py se encuentra
Código: [Seleccionar]
import os
import sys


#sys.path.append('..')

#print(os.listdir(sys.path[-1]))

#print(sys.path[-1])

print(__file__)
print(os.path.abspath(__file__))
print(os.path.dirname(os.path.abspath(__file__))

Código: [Seleccionar]
$ python3 test1.py
test1.py
/home/alex/proyectos/python/tests/test1.py
/home/alex/proyectos/python/tests
$ cd ..
$ python3 tests/test1.py
tests/test1.py
/home/alex/proyectos/python/tests/test1.py
/home/alex/proyectos/python/tests

¿Cómo añades a tu sys.path .. con respecto al directorio de tu archivo .py?

Código: [Seleccionar]
import os
import sys

file_dir = os.path.dirname(os.path.abspath(__file__))

sys.path.append(os.path.join(file_dir,'..'))

print(sys.path[-1])
print(os.listdir(sys.path[-1]))

No importa desde que directorio se ejecute o sea llamado tu archivo .py, siempre vas a obtener el mismo resultado
Código: [Seleccionar]
$ python3 tests/test1.py
/home/alex/proyectos/python/tests/..
['tests', 'ANU', 'hashtables_tests']
$ cd tests
$ python3 test1.py
/home/alex/proyectos/python/tests/..
['tests', 'ANU', 'hashtables_tests']

¿Porqué es mejor usar os.path.join?, porque Windows y Linux no manejan las rutas de la misma forma. Lo podrías hacer con file_dir+”/..”, pero no sería portable.
Título: Re:Dudas con escribir codigo
Publicado por: Miquel_S en 02 de Agosto de 2016, 18:08:42
Gracias por la explicación tsk, quería empezar a hacer algo mas aparte de multiplicar dos números y ver su resultado con print y me estoy dando cuenta que estoy a años luz de poder hacerlo.  :( :(
Título: Re:Dudas con escribir codigo
Publicado por: Miquel_S en 07 de Agosto de 2016, 09:35:52
Por que este simple codigo no funciona como deberia:
Código: Python
  1. #!/usr/bin/env python3.5
  2. # -*- coding: iso-8859-15 -*-
  3.  
  4. '''Escribir una función que tome un carácter y devuelva True
  5. si es una vocal, de lo contrario devuelve False.'''
  6. def es_vocal(vocal):
  7.         for letra in ['a', 'e', 'i', 'o', 'u']:
  8.                 if(vocal == letra):
  9.                         return True
  10.                 else:
  11.                         return False
Solo es True con la vocal 'a' las demas dan como resultado False

Gracias.
Título: Re:Dudas con escribir codigo
Publicado por: ma4826 en 07 de Agosto de 2016, 10:40:10
Con eso hace lo que quieres:

Código: Python
  1. #!/usr/bin/env python3.5
  2. # -*- coding: iso-8859-15 -*-
  3.  
  4. '''Escribir una función que tome un carácter y devuelva True
  5. si es una vocal, de lo contrario devuelve False.'''
  6. def es_vocal(vocal):
  7.         for letra in ['a', 'e', 'i', 'o', 'u']:
  8.                 if(vocal == letra):
  9.                         return True
  10.         return False

 En tu caso sólo llega a comprobar la 'a' porque sino es la 'a' sales de la función devolviendo un False. Siempre ejecutas un sólo ciclo del for.

 Saludos,

 Miguel.
Título: Re:Dudas con escribir codigo
Publicado por: KILLERJC en 07 de Agosto de 2016, 11:18:26
No seria mejor algo asi?, no estoy en linux para probarlo.


Código: Python
  1. def es_vocal(vocal):
  2.         return (vocal in ['a', 'e', 'i', 'o', 'u'])

O en su defecto:

Código: Python
  1. def es_vocal(vocal):
  2.         if vocal in ['a', 'e', 'i', 'o', 'u']:
  3.                  return True
  4.         return False

---------------

Y una mas que encontre:


Código: Python
  1. a = ['a', 'e', 'i', 'o', 'u']
  2.  
  3. try:
  4.     b=a.index(vocal)
  5. except ValueError:
  6.     return False
  7. Else:
  8.     return True
Título: Re:Dudas con escribir codigo
Publicado por: Miquel_S en 07 de Agosto de 2016, 18:43:45
Gracias a los dos por vuestra ayuda, he probado los códigos y parecen funcionar excepto el ultimo, voy a estudiarlo a ver si consigo saber el porque no funciona, igual es fallo mio.

Saludos!
Título: Re:Dudas con escribir codigo
Publicado por: KILLERJC en 07 de Agosto de 2016, 19:55:54
Tal ves por que el else tiene una mayuscula .. esto si funciona:

Código: Python
  1. vocal = 'b'
  2. a = ['a', 'e', 'i', 'o', 'u']
  3. try:
  4.         b = a.index(vocal)
  5. except ValueError:
  6.         print("False")
  7. else:
  8.         print("True")
Título: Re:Dudas con escribir codigo
Publicado por: Miquel_S en 08 de Agosto de 2016, 03:55:24
Ya veo donde tenia el error, hice como tu al principio, me deje:
Código: Python
  1. vocal = 'b'

Gracias KILLERJC
Título: Re:Dudas con escribir codigo
Publicado por: Picuino en 08 de Agosto de 2016, 07:59:15
Python tiene una filosofía según la cual siempre debería haber una sola forma de hacer bien un programa.
El segundo ejemplo de Killerjc parece el más adecuado. Incluso se puede simplificar.
Código: Python
  1. if vocal in 'aeiou':
  2.       return True
  3.    return False

Un saludo.
Título: Re:Dudas con escribir codigo
Publicado por: Picuino en 08 de Agosto de 2016, 08:23:51
El Zen de Python en realidad dice:
"Debería haber una -y preferiblemente sólo una- manera obvia de hacerlo."

http://www.todopic.com.ar/foros/index.php?topic=46643.0

Saludos.
Título: Re:Dudas con escribir codigo
Publicado por: Miquel_S en 08 de Agosto de 2016, 14:19:06
Gracias Picuino por la aclaración, una pregunta para los maestros ¿Hay manera de hacer un debug al código y ver por ejemplo como va cambiando el valor de una variable sin tener que usar un IDE? Es que he intentado instalar eclipse con el plugin PyDev y no se por que motivo a la hora de crear un proyecto la opción de PyDev no aparece en el menú.

Saludos!
Título: Re:Dudas con escribir codigo
Publicado por: Picuino en 08 de Agosto de 2016, 16:35:03
No sabría ayudarte con PyDev. Yo siempre hago el debug con sentencias print y el IDE más complicado que uso es el que viene con Python: IDLE.
Título: Re:Dudas con escribir codigo
Publicado por: Miquel_S en 08 de Agosto de 2016, 17:37:01
Gracias Picuino por tu aportación, de ser así voy a ver si consigo aprender a usar el Vim en Linux. Si alguien usa dicho editor agradecería una ayuda para configurarlo.
Título: Re:Dudas con escribir codigo
Publicado por: Miquel_S en 26 de Agosto de 2016, 13:04:24
Hola de nuevo compañeros sigo intentando aprender python, mi pregunta es referente a la instrucción
Código: Python
  1. sys.exit()
la cual creo entender que lo que hace es finalizar el script, pero algunas veces se usa como argumento dentro de los paréntesis un 1 otras veces -1 incluso algún string, quiere decir que puedo usar cualquiera de las tres. 

Gracias.
Título: Re:Dudas con escribir codigo
Publicado por: Miquel_S en 26 de Agosto de 2016, 16:07:00
sys.exit permite terminar la ejecución del script devolviendo un valor (en Unix/Linux esto se considera una muy buena práctica ya que permite encadenar comandos en función de si terminaron bien, retornando 0 o si tuvieron algún problema, un valor diferente a 0).


Título: Re:Dudas con escribir codigo
Publicado por: Miquel_S en 26 de Agosto de 2016, 19:11:27
Alguien puede decirme porque este sencillo código no me funciona.
Código: Python
  1. #!/usr/bin/env python3.5
  2. # -*- coding: iso-8859-15 -*-
  3.  
  4. import sys
  5.  
  6. def test():
  7.         print('Numero de argumentos:', len(sys.argv), 'argumentos')
  8.         print('Lista de argumentos:', str(sys.argv))
  9.        
  10.         return (sys.argv[1])
  11.  
  12.  
  13. if __name__ == '__main__':
  14.  
  15.         test()

En la terminal no se visualiza el
Código: Python
  1. return (sys.argv[1])

Gracias.

(http://www.todopic.com.ar/foros/imgtiny/29wux6b.png)
Título: Re:Dudas con escribir codigo
Publicado por: KILLERJC en 26 de Agosto de 2016, 19:48:06
Código: Python
  1. if __name__ == '__main__':
  2.  
  3.         printf (test())

¿? o tal ves asignarlo a una variable y luego el print
Título: Re:Dudas con escribir codigo
Publicado por: Miquel_S en 27 de Agosto de 2016, 03:58:05
Hola KILLERJC, así lo había probado y me funcionaba y creía que con return era lo mismo pero al parecer debo utilizar print.

Muchas Gracias.
Título: Re:Dudas con escribir codigo
Publicado por: KILLERJC en 27 de Agosto de 2016, 09:46:00
el return seria como para algo asi:

Código: Python
  1. variable = test()
Título: Re:Dudas con escribir codigo
Publicado por: Miquel_S en 27 de Agosto de 2016, 13:16:31
De nuevo gracias, también había probado esta opción pero sigo necesitando
Código: Python
  1. print((variable))
creía poder ver el valor que retorna por ejemplo
Código: Python
  1. return (sys.argv[1])
sin usar print.

Saludos!
Título: Re:Dudas con escribir codigo
Publicado por: Picuino en 27 de Agosto de 2016, 15:32:46
La instrucción return lo que hace es que la función devuelva un valor. Si quieres imprimirlo, necesitas la instrucción print. Si no escribes print, no imprime nada. Es evidente.

Quizá lo que te confunda es el modo de linea de comandos. Si en la linea de comandos escribes una variable o una función, Python imprime en la siguiente linea el valor que contiene esa variable o el valor devuelto por la función. Escribir en la linea de comandos viene muy bien para depurar programas de forma rápida. Pero si haces eso mismo en un script, no se imprime nada.

Un saludo.
Título: Re:Dudas con escribir codigo
Publicado por: Miquel_S en 27 de Agosto de 2016, 16:26:39
Gracias Picuino por la nota, creía que fuera de la linea de comandos también debía de funcionar.

Saludos!
Título: Re:Dudas con escribir codigo
Publicado por: Miquel_S en 31 de Agosto de 2016, 16:56:34
Hola, estoy mirando códigos para ir aprendiendo y veo que en algunos se usa la instrucción
Código: Python
  1. sys.stdout.flush()
y por lo que he leído en el help de sys sirve para limpiar el buffer de escritura, mi pregunta es ¿Cuando debe usarse dicha instrucción? ya que donde mas la veo es después de haber escrito en la consola con la instruccion
Código: Python
  1. sys.stdout.write()

Gracias.
Título: Re:Dudas con escribir codigo
Publicado por: Miquel_S en 05 de Septiembre de 2016, 15:14:00
Alguien puede decirme donde estoy fallando en el código de esta clase:
Código: Python
  1. #!/usr/bin/env python3.5
  2. # -*- coding: iso-8859-15 -*-
  3.  
  4.  
  5. import serial
  6. import sys
  7.  
  8.  
  9. #-----------------------
  10. #-- Mostrar la ayuda
  11. #-----------------------
  12. #def help():
  13.  
  14.  
  15. #----------------------------
  16. #-- Configurar puerto SCI
  17. #----------------------------
  18. class PortSerial(object):
  19.        
  20.         def __init__(self, port, baudrate, timeout):
  21.                 self.port = port
  22.                 self.baudrate = baudrate
  23.                 self.timeout = timeout
  24.  
  25.                 try:
  26.                         sg = serial.Serial(self, port, baudrate, timeout)
  27.  
  28.                 except serial.SerialException:
  29.                         #--Error al abrir el puerto serie
  30.                         sys.stderr.write('Error al abrir el puerto...')
  31.                         sys.exit(1)
  32.                         sg.close()  #-- Cerrar puerto serie
  33.  
  34.                 print(('\n' + self.port + ' is open...'))
  35.                 print(('baudrate: ' + str(self.baudrate) + ' baud'))
  36.                 print(('timeout: ' + str(self.timeout) + ' second'))

Gracias.
Título: Re:Dudas con escribir codigo
Publicado por: Miquel_S en 07 de Septiembre de 2016, 18:26:30
Sigo probando y nada que no consigo abrir el puerto, alguna idea.
Código: Python
  1. #!/usr/bin/env python3.5
  2. # -*- coding: utf-8 -*-
  3.  
  4. import serial
  5. #import sys
  6.  
  7.  
  8. class Puerto(object):
  9.  
  10.     def __init__(self, port, baudrate, timeout):
  11.         super(Puerto, self).__init__()
  12.         self.port = port
  13.         self.baudrate = baudrate
  14.         self.timeout = timeout
  15.  
  16.     def open_port(self):
  17.         try:
  18.             sg = serial.Serial()
  19.             print(('DEBUG: ' + str(sg)))
  20.  
  21.         except serial.SerialException:
  22.             print(('Error al abrir el puerto ' + self.port))
  23.  
  24.     def msg(self):
  25.         print(('\n' + self.port + ' is open...'))
  26.         print(('baudrate ' + str(self.baudrate)))
  27.         print(('timeout ' + str(self.timeout)))

Para probarlo hago lo siguiente igual me equivoco:
Código: Python
  1. from prueba_clase import*
  2. puerto = Puerto('/dev/ttyUSB0', 9600, 1.0)
  3. puerto.open_port()

y este es el resultado:
Código: Python
  1. DEBUG: Serial<id=0x7ff6a6dbef98, open=False>(port=None, baudrate=9600, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False)

Saludos!
Título: Re:Dudas con escribir codigo
Publicado por: colotron en 07 de Septiembre de 2016, 21:00:35
...
y este es el resultado:
Código: Python
  1. DEBUG: Serial<id=0x7ff6a6dbef98, open=False>(port=None, baudrate=9600, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False)

Saludos!

La verdad que no tengo idea de python, no esta en mi repertorio, pero lo único que se me ocurre que pueda fallar no relacionado con eso es que te esté faltando algún permiso para manejar el puerto.
Por una de esas casualidades: ¿hiciste ya una regla en /etc/udev/rules.d con el VID y PID del dispositivo?.
Podés verificar enchufando y haciendo
ls -l /dev/ttyUSB0 a ver que grupo tiene permisos, y si tiene permisos r/w.

Si ya verificaste eso, listo, es lo único que puedo aportar de mi parte  :?
Saludos
Título: Re:Dudas con escribir codigo
Publicado por: Miquel_S en 08 de Septiembre de 2016, 03:10:33
Gracias colotron por tu respuesta, el puerto ya lo hice funcionar pero sin hacerlo con la programación orientada a objetos, mas bien creo que me esta faltando algo en la clase pero no se lo que es, haber si alguien con mas sabiduría nos dice  el qué.

Gracias
Título: Re:Dudas con escribir codigo
Publicado por: colotron en 08 de Septiembre de 2016, 10:56:02
Estoy viendo la intro de pyserial:
https://github.com/pyserial/pyserial/blob/master/documentation/shortintro.rst

Código: Python
  1. #!/usr/bin/env python3.5
  2. # -*- coding: utf-8 -*-
  3.  
  4. import serial
  5. #import sys
  6.  
  7.  
  8. class Puerto(object):
  9.  
  10.     def __init__(self, port, baudrate, timeout):
  11.         super(Puerto, self).__init__()
  12.         self.port = port
  13.         self.baudrate = baudrate
  14.         self.timeout = timeout
  15.  
  16.     def open_port(self):
  17.         try:
  18.             sg = serial.Serial()
  19.             print(('DEBUG: ' + str(sg)))
  20.  
  21.         except serial.SerialException:
  22.             print(('Error al abrir el puerto ' + self.port))
  23.  
  24.     def msg(self):
  25.         print(('\n' + self.port + ' is open...'))
  26.         print(('baudrate ' + str(self.baudrate)))
  27.         print(('timeout ' + str(self.timeout)))

Para probarlo hago lo siguiente igual me equivoco:
Código: Python
  1. from prueba_clase import*
  2. puerto = Puerto('/dev/ttyUSB0', 9600, 1.0)
  3. puerto.open_port()

y este es el resultado:
Código: Python
  1. DEBUG: Serial<id=0x7ff6a6dbef98, open=False>(port=None, baudrate=9600, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False)

Y me parece que la secuencia de apertura está mal. Es decir, en tu constructor seteas baud, nombre de puerto, etc como variables internas de la clase, pero no veo donde se las seteas al objeto serial de la clase.
Observá que el mensaje de DEBUG dice port=None. Te faltaría por lo menos hacer un
sg.port = puerto

Por otro lado... donde queda almacenada la instancia serial sg?, no entiendo mucho de python pero no estarás confundiendo tu clase propia con la clase que ya viene implementada en pyserial?.

Yo intentaría empezar sin definir una clase propia, usando una instancia de serial y nada más. Después una vez comprobado eso hago mi clase propia a gusto.
Mi intento sería:

Código: [Seleccionar]
import serial

#Abrir puerto, default = 9600,8,N,1.
#Al pasarle puerto ya hace el open?, si no le paso nada no lo hace?
ser = serial.Serial('/dev/ttyUSB0')  # open serial port
print(ser.name)         # check which port was really used

#Escribir puerto
ser.write(b'hello')     # write a string

#Leer
x = ser.read()          # read one byte
s = ser.read(10)        # read up to ten bytes (timeout)
line = ser.readline()   # read a '\n' terminated line

#Cerrar
ser.close()             # close port

#Ahora que está cerrado es seguro cambiar baudrate, paridad, etc
#No cambiaría esos parámetros mientras el puerto está abierto, por las dudas.
Título: Re:Dudas con escribir codigo
Publicado por: Miquel_S en 08 de Septiembre de 2016, 12:58:56
Hola colotron así como lo planteas ya lo tengo resuelto sin ningún problema, el problema lo tengo con el otro código.

Saludos!
Título: Re:Dudas con escribir codigo
Publicado por: tsk en 08 de Septiembre de 2016, 14:41:12
En realidad no estas abriendo ningún puerto

Código: [Seleccionar]
sg = serial.Serial()

a seria.Serial le necesitas pasar los parámetros, incluso el mismo DEBUG te informa que el puerto es igual a None

para que funcione deberías

Código: [Seleccionar]
sg = serial.Serial(port=self.port,baudrate=self.baudrate,timeout=self.timeout)

De igual forma no veo el porque del
Código: [Seleccionar]
super(Puerto, self).__init__()
No es necesario

Incluso en tu primera implementación el error estaba en

Código: [Seleccionar]
sg = serial.Serial(self, port, baudrate, timeout)Sería
Código: [Seleccionar]
sg = serial.Serial(port=self.port, baudrate=self.baudrate, timeout=self.timeout)
Esta es mi implementación

Código: [Seleccionar]
class Serial(RawDriver):
    """ Define Serial printer """

    def __init__(self, **kwargs):
        """
        @param devfile  : Device file under dev filesystem
        @param baudrate : Baud rate for serial transmission
        @param bytesize : Serial buffer size
        @param timeout  : Read/Write timeout
        """
        if "devfile" in kwargs:
            self.devfile  = kwargs["devfile"]
        else:
            self.devfile = "/dev/ttyS0"
        if "baudrate" in kwargs:
            self.baudrate = int(kwargs["baudrate"])
        else:
            self.baudrate = 9600
        if "bytesize" in kwargs:
            self.bytesize = int(kwargs["bytesize"])
        else:
            self.bytesize = 8
        if "timeout" in kwargs:
            self.timeout  = int(kwargs["timeout"])
        else:
            self.timeout = 1
        #self.barcode = barcode
        #self.dpi = 180
        self.open()

    def open(self):
        """ Setup serial port and set is as escpos device """
        self.device = serial.Serial(port=self.devfile, baudrate=self.baudrate, bytesize=self.bytesize, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, timeout=self.timeout, dsrdtr=True)

        if self.device is not None:
            print "Serial printer enabled"
        else:
            print "Unable to open serial printer on: %s" % self.devfile

Código: [Seleccionar]
class RawDriver(BaseDriver):
    def __init__(self):
        pass

    def _raw(self,msg,end=True):
        if hasattr(self.device,"write"):
            self.device.write(msg)
        elif hasattr(self.device,"send"):
            self.device.send(msg)

Código: [Seleccionar]
class BaseDriver(object):
    dtype = None #Driver type OSDriver, RawDriver
    device = None

    def open(self):
        pass

    def _raw(self,msg,end=True):
        pass

    def __del__(self):
        if self.device:
            self.device.close()
        self.device = None

Probablemente uses el formato del primer código (adaptándolo a lo que necesitas). En mi aplicación lo hice de esa forma porque se pueden tener varias formas de comunicarse con el dispositivo en cuestión (Impresora ESC/POS), y no sólo por el puerto serie por lo que era necesario crear una misma interfaz para todas las formas en que se podría conectar, pero tentativamente tu código podría lucir como

Código: [Seleccionar]
class Serial(object):
    device = None
    def __init__(self, **kwargs):
        """
        @param devfile  : Device file under dev filesystem
        @param baudrate : Baud rate for serial transmission
        @param bytesize : Serial buffer size
        @param timeout  : Read/Write timeout
        """
        if "devfile" in kwargs:
            self.devfile  = kwargs["devfile"]
        else:
            self.devfile = "/dev/ttyS0"
        if "baudrate" in kwargs:
            self.baudrate = int(kwargs["baudrate"])
        else:
            self.baudrate = 9600
        if "bytesize" in kwargs:
            self.bytesize = int(kwargs["bytesize"])
        else:
            self.bytesize = 8
        if "timeout" in kwargs:
            self.timeout  = int(kwargs["timeout"])
        else:
            self.timeout = 1
        #self.barcode = barcode
        #self.dpi = 180
        self.open()

    def open(self):
        """ Setup serial port and set is as escpos device """
        self.device = serial.Serial(port=self.devfile, baudrate=self.baudrate, bytesize=self.bytesize, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, timeout=self.timeout)

        if self.device is not None:
            print "Serial printer enabled"
        else:
            print "Unable to open serial printer on: %s" % self.devfile

    def send(self,msg):
        self.device.write(msg)

    def read(self,nBytes=1):
        return self.device.read(nBytes);

    def readline(self):
        return self.device.readline()

    def close(self):
        if self.device is not None:
            self.device.close()
            self.device = None

    def __del__(self):
        self.close()

Y para usarlo

Código: [Seleccionar]
ser = Serial(devfile="/dev/ttyUSB0",baudrate=9600, bytesize=8)
ser.open()
ser.read()
ser.readline()
ser.close()
Título: Re:Dudas con escribir codigo
Publicado por: Miquel_S en 09 de Septiembre de 2016, 03:15:26
 :-/ :-/ :-/ :-/ :-/ :-/  Muchísimas gracias tsk por la solución, aunque desde un principio pensé que el error era que algo me faltaba en el código, por mucho que lo miraba y probaba cosas no daba con el, de nuevo muchas gracias.

Saludos!