visual - ¿Cómo estás usando IronPython?
python dotnet (12)
Tengo ganas de tomar un poco de lenguaje dinámico moderno koolaid, así que creí todo lo que había en el blog y podcasts de Michael Foord, compré su libro (y leí un poco), y agregué un tiempo de ejecución IPy incrustado a un gran aplicación existente hace aproximadamente un año (aunque eso era para otra persona y realmente no la usé).
Ahora necesito hacer algunas cosas de generación de código bastante simples, donde llamaré algunos métodos en algunos objetos .net (objetos personalizados, C # -autorizados), crearé algunas cadenas, escribiré algunos archivos, etc.
La experiencia de probar esto me hace sentir como el niño pequeño que piensa que él es el único que puede ver que el Emperador no tiene ropa puesta. Si está usando IronPython, realmente apreciaría saber cómo lidia con los siguientes aspectos:
- Edición de código: ¿utiliza el marco .NET sin Intellisense?
- Refactorización: sé que una carga de ''refactorización'' se trata de trabajar en torno al trabajo ocupado relacionado con el lenguaje, por lo que si Python es lo suficientemente liviano, entonces no lo necesitaremos. Sin embargo, me parece que las cosas como los nombres son esenciales para desarrollar iterativamente el código de calidad, independientemente de idioma.
- Tiempo de inicio paralizante: una de las cosas que se supone que debe ser buena para los lenguajes interpretados es la falta de tiempo de compilación que conduce a un rápido desarrollo interactivo. Desafortunadamente, puedo compilar una aplicación C # y lanzarla más rápido de lo que IPy puede iniciar.
- Piratería interactiva: se supone que la consola / respuesta de IPy es buena para esto, pero no he encontrado una buena manera de tomar el código al que ha llegado interactivamente y de guardarlo en un archivo; cortar y pegar desde la consola es bastante miserable. Y la consola parece contener referencias a los ensamblados .NET que has importado, por lo que debes salir y reiniciarla si también estás trabajando en C #. Hackear C # en algo como LinqPad parece una forma mucho más rápida y fácil de probar cosas (y tiene el Intellisense adecuado). ¿Utilizas la consola?
- Depuración - ¿cuál es la historia aquí? Sé que alguien en el equipo de IPy está trabajando en un proyecto de pasatiempo de la línea de comandos, pero digamos que no me atraen inmediatamente los depuradores de la línea de comandos. Realmente no necesito un depurador de los pequeños scripts de Python, pero lo haría si usara IPy para las pruebas de unidades de scripts, por ejemplo.
- Pruebas unitarias: puedo ver que los lenguajes dinámicos podrían ser excelentes para esto, pero ¿existe alguna integración de IDE con el corredor de pruebas (como Resharper, etc.)? El libro de Foord tiene un capítulo sobre esto, que admito que aún no he leído correctamente, pero parece implicar conducir un corredor de pruebas en modo consola desde el símbolo del sistema, lo que se siente como un enorme paso para dejar de usar un corredor de prueba integrado como TestDriven.net o Resharper.
Tengo muchas ganas de creer en estas cosas, por lo que sigo trabajando suponiendo que me he perdido algo. Realmente me gustaría saber cómo otras personas están lidiando con IPy, particularmente si lo están haciendo de una manera que no parece que hayamos perdido 15 años de desarrollo de herramientas.
Actualización: (julio de 2010) Esta pregunta parece bastante anticuada, ahora que hay ambas herramientas oficiales de IronPython para VS y PyCharm que muestran mucha promesa y ninguna de las cuales existía cuando la escribí. Gracias a todos los que contestaron. A aquellos de ustedes que están contentos sin las herramientas de refactorización automática, les puedo recomendar que nunca, nunca, utilicen un IDE con una buena refactorización automática. Una vez que lo haya hecho, se preguntará por qué pensó que estaba feliz con la búsqueda y reemplazo, y nunca más querrá trabajar sin eso. Si nada más, la capacidad de renombrar instantáneamente los identificadores sin preocuparse por reemplazar el bit de texto incorrecto cambia su enfoque completo para nombrar cosas.
Últimamente he estado usando IronPython (y el DLR en general) en mis proyectos para varias cosas. Algunos ejemplos:
- Hice un generador de documentos basado en plantillas que usa scripts py para construir y transformar las variables de contexto que se pasan al procesador de plantillas (Excel, Word, html-> pdf)
- Como evaluador de expresiones para un motor de reglas especializado. Los scripts se guardan en una columna en una tabla de base de datos y se evalúan en tiempo de ejecución para determinar qué regla se aplica.
- Como pasos en un motor ETL. Básicamente, tengo algunos componentes que pueden leer archivos de Excel y uso scripts de Python para transformar los datos y crear entidades NHibernate para poblar una base de datos.
- Scripts de configuración dinámica para componentes C #.
- Un motor de cálculo para algunos indicadores que deben crearse a partir de un gran conjunto de datos. Estoy combinando las extensiones paralelas con scripts precompilados, el rendimiento es bueno hasta ahora.
Cosas como esas. Una vez que el Motor está configurado correctamente, con las rutas y las referencias establecidas, básicamente puede usar un script para casi cualquier cosa.
Casi todas estas cosas se ejecutan en aplicaciones mvc de asp.net, y hasta ahora todo va bien. Descubrí que el ScriptEngine y algunos componentes como ScriptScope son seguros para subprocesos, por lo que incluso puedo compartir un Motor configurado dentro de un contenedor IoC (por ejemplo, Windsor) entre los controladores y demás.
En cuanto a un editor, edito más veces la mayoría del tiempo. El editor de Python de VS 2010 tiende a ser un poco inestable, aunque la edición rápida no es un problema.
¿Qué hay de IronPython Tools para Visual Studio 2010?
Las herramientas IronPython proporcionan un editor de código Python, un sistema de proyecto basado en archivos y un intérprete interactivo de Python, todo dentro de Visual Studio 2010, y todo gratis. http://ironpython.net/tools/
Creo que este complemento cubriría la mayoría de tus puntos.
Espero eso ayude,
Patricio
Acabo de comprar el libro de Foord, así que ahora solo lo estoy aprendiendo. Realmente espero usarlo para el desarrollo web, pero lamentablemente tengo que esperar hasta que sea compatible con asp.net mvc. También planeo usarlo como una herramienta de scripting para sistemas Windows ya que puedo utilizar el marco .net
En el trabajo usamos IronPython contra el modelo de objetos de SharePoint. Es perfecto para muchos pequeños programas que son más grandes que un script de powershell, pero no es algo que deba implementarse como un artefacto en SharePoint. Es ideal para la creación rápida de prototipos en servidores donde Visual Studio no está instalado. Normalmente usamos Notepad ++ como nuestro editor de elección.
Estoy ejecutando un conjunto de simulaciones de blackjack en Python 2.6 contra IronPython 2.6, y a pesar de las exageraciones, IronPython parece ser un poco más lento (¿tal vez en un 10%?) El código es muy simple, solo cosas como:
def highcount(hand):
total=0
for c in hand:
if c[1]==11 and 11+total>21:
total+=1
else:
total+=c[1]
return total
y
def dmove():
if ( (dhand[0][1]==11 and dhand[1][1]==10) or
(dhand[0][1]==10 and dhand[1][1]==11) ):
return 21 # should return blackjack
while 1:
lc=lowcount(dhand)
hc=highcount(dhand)
if lc>21: return lc # dealer busts
if lc>=17: return hc # stand on soft 17
if hc>=17: return hc # stand on hard 17
dhand.append(deck.pop()) # hit otherwise
Si las optimizaciones de .NET VM son similares a las de la JVM, es bastante posible que durante ejecuciones más largas, IronPython pueda ejecutar la simulación más rápido.
Otro punto importante a tener en cuenta es que la simulación de blackjack se presta fácilmente al desove en múltiples subprocesos que GIL de CPython hace completamente inútiles en términos de aumento de velocidad. Con IronPython obtengo la aceleración total del 400% en un quadcore, lo que es realmente genial.
El código no hace uso de ninguna característica esotérica de Python (eso es algo bueno) lo que significa que se ejecutó al 100% sin modificar en IronPython.
Estoy usando IPy en un entorno integrado para ejecutar scripts de prueba.
1 y 2. Tiene razón, no hay mucho soporte para la edición o refactorización de código; la compatibilidad adecuada con Visual Studio sería excelente.
Ignorar su tercer punto: interpretado vs compilado es un argumento antiguo.
Todavía no he hecho mucho de hacking interactivo, así que no puedo comentar sobre el cuarto punto.
Utilizo el depurador de Visual Studio para depurar mis scripts IPy.
Tampoco sé acerca de una integración de IDE de prueba unitaria.
Estoy usando Iron Python, no profesionalmente, desafortunadamente, sino como un lenguaje de Desarrollo Rápido para mis proyectos personales.
Python es un gran lenguaje para la facilidad de uso, la brevedad pero la legibilidad del código y la simplicidad. Parte de esto se debe a que es un lenguaje dinámico, pero también a su sintaxis básica.
Sin embargo, no soy un gurú de cpython, y puedo obtener mucho más de Iron Python que cpython, ya que puedo aprovechar fácilmente la plataforma .NET, en la que estoy mucho más en casa. Estoy decepcionado de que actualmente no hay ningún puerto para las bibliotecas Twisted en cpython, las únicas bibliotecas de Python con las que me siento cómodo, ya que serían muy útiles en .NET.
También utilizo la ventana interactiva solo para probar las estructuras .NET cuando estoy codificando en C #.
Estoy usando PyDev para escribir el código de IronPython. Estoy tratando de separar el código específico de .NET tanto como sea posible para poder ejecutar los scripts de Python (de hierro) desde PyDev. Gracias a PyDev, puedo usar Pylint, que se puede encontrar en http://www.logilab.org/857 . Las versiones recientes de PyDev pueden configurar el intérprete incluso por archivo o base de proyecto. Entonces, puedo cambiar fácilmente los intérpretes de IronPython a CPython y viceversa. De esta manera, puedo ver que mi código es portátil entre implementaciones de Python. (Aunque no estoy usando, Jython 2.5 RC también se puede usar en PyDev).
Al tener un código compatible con Python y IronPython 2.5, puedo usar la refactorización en PyDev, consulte http://pydev.sourceforge.net/refactoring.html .
IronPython Studio sería una buena opción si fuera compatible con IronPython 2.x, pero lamentablemente no lo es.
IronPython es una gran solución, pero siempre vuelvo a CPython para Windows. Por qué ?
En mi experiencia, CPython bajo Windows, Mac OS / X y * NIX son prácticamente lo mismo. Puedo usar casi todas las "baterías" en cada entorno. Con frecuencia desarrollo aplicaciones en Linux y las envío a servidores Windows. Un par de problemas con los hilos aparte, no he tenido problemas.
IronPython, por otro lado, es un envoltorio de lenguaje Python alrededor de .Net Framework. Me parece mucho más fácil de usar que C #, pero eso es todo. Mis programas de CPython no funcionan sin un trabajo considerable. Las baterías para IronPython son diferentes.
Si su objetivo es ser productivo en .Net, entonces IPy probablemente esté bien. Sin embargo, si estás buscando habilidades portátiles de Python, entonces lo evitaría.
Las herramientas PyDev, Wing, PyCharm y IronPython para Visual Studio son compatibles con intellisense para .NET bajo IronPython. Tengo la sensación de que SharpDevelop también tiene inteligencia para IronPython.
El tiempo de inicio mejoró mucho bajo IronPython 2.6 y nuevamente en 2.7. Sin embargo, sigue siendo considerablemente más lento que el CPython.
Reparador de bicicletas y cuerdas son dos herramientas de refactorización automatizadas populares para Python. Nunca he encontrado una necesidad para ninguno de ellos.
pdb (el depurador de la biblioteca estándar de Python) funciona con IronPython. Las herramientas PyDev, SharpDevelop y IronPython para Visual Studio son compatibles con la depuración de IronPython.
He utilizado herramientas de prueba integradas (Wing tiene un buen soporte de unit unit test SharpDevelop es compatible con unittest y unittest2 para IronPython, PyDev y PyCharm probablemente también tengan una buena integración unittest). Prefiero ejecutar mis pruebas desde la línea de comandos. unittest2 es ideal para esto, ya que elimina la necesidad de escribir su propia recopilación de prueba / código de ejecución.
Utilizo mucho el intérprete interactivo para la experimentación y, ocasionalmente, como un caparazón mejorado.
Mi uso de IronPython se ha limitado a hacer prototipos rápidos para mí, por lo que no puedo decir mucho al respecto. Pero si está buscando un IDE específico para IronPython, IronPython Studio es pasable. Le brindará algunas funciones de Intellisense, aunque a veces es un poco inestable, así que no cierre la ventana de documentación de MSDN todavía. Te permitirá depurar interactivamente como cualquier otro proyecto .Net. También es compatible con el diseñador de formularios de Visual Studio 2008 si prefiere que su GUI sea de esa manera. No lo he probado, pero también puede admitir la ejecución de pruebas nUnit utilizando TestDriven.net.
Lamentablemente, los nombres y otras funciones de refactorización ofrecidas por VS 2008 parecen no ser compatibles.
do you use the .NET framework without Intellisense?
Sí. Sólo uso emacs con IronPython. "M- /" es lo suficientemente bueno para mí. Ocasionalmente cambio a Reflector y MSDN cuando realmente necesito información sobre el SDK.
Refactoring
En realidad, significa "Refactorización automática" cuando dice "Refactorización". Hago mucho Refactoring mientras codifico. Podría ser mejor con algo de automatización. Pero estoy bien con la refactorización manual. También me obliga a incluir más pruebas. Nunca he usado ninguna función IDE con refactorización de forma extensa, tal vez por eso no estoy sufriendo. La simple búsqueda y reemplazo está bien para mí.
Crippling startup time
Sí, este es mi mayor dolor, a pesar de que estoy trabajando en Quad-Core de 3GHz con 4G Ram, se necesitan 50s para ejecutar 359 casos de prueba. La mitad de ese tiempo (25s) es el tiempo de inicio !! Parece que IronPython realiza una tarea de procesamiento muy pesada al importar un módulo grande. Ahora planeo escupir mis pruebas en partes para mitigar este dolor.
Interactive hacking - Do you use the console?
Uso la consola de vez en cuando, cuando quiero probar una idea ad hoc. No tengo problema con eso. Sin embargo, la mayoría de las veces escribí mi pensamiento en prueba de unidad.
Debugging - what''s the story here?
Si depuración significa punto de interrupción y inspección variable. Sólo uso declaración impresa para esas cosas. El tipo de aplicación en la que estoy trabajando está a punto de vivir y se mantendrá durante al menos una década. Para manejar el código defectuoso, solo apuesto a 3 cosas: código comprensible, prueba de unidad y registro extenso.
Unit testing
Nunca me acerco a ninguna herramienta que mencionas. Sólo use unittest.TextTestRunner. Además del horrible tiempo de inicio, no tengo ninguna otra queja.
** ACTUALIZADO **
Acabo de terminar de actualizar a IPy 2.6B1 con un resultado fenomenal. ¡El tiempo de inicio se reduce de 25 a 6 y mi tiempo de prueba general se reduce de 50 a 16!
ASOMBROSO !