Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





¿Cómo integrar C++/C# con scripts python?

Iniciado por chan, 21 de Agosto de 2008, 07:27:52 PM

« anterior - próximo »

chan

Buenas!

Hace tiempo que tengo en mente el tema de la arquitectura de aplicaciones "scriptables", pero por el poco tiempo libre que tengo no he podido googlear lo suficiente como para enterarme cómo hacerlo. Mi pregunta es ¿donde podría leer sobre como integrar mis aplicaciones en C++, C# o lo que sea, con scripts que desarrolle (en python por ejemplo)? pensad por ejemplo en que quiera programar la IA de un juego mediante scripts en python y los quiera integrar con un motor de IA hecho en C++ (no se si acabo de decir una burrada)

blau

En c++ ni idea, pero en c# tienes ironpython que va de lujo.

Yo lo tuve mirando para los scripts de un ( no se como llamarlo sin ofender a mi conciencia ) ,"juego" que estoy haciendo.

Aunque mi idea es usarlo para comandos desde la consola, los scripts de definicion de mapas los he hecho directamente en c#, porque dentro de .NET te dan acceso al compilador.

Con lo cual dinamicamente compilas a lenguaje intermedio, cargas el assembly y lo ejecutas como si fuera una aplicacion.

Muy elegante.

Aunque ultimamente me ha generado dudas, porque lo que estoy haciendo lo hago en XNA, y pretendo que los mapas los pueda crear cualquiera y me ha saltado la duda de si MS permitiria cargar las mapas de esta forma.
Aunque en principio todo es un entorno seguro, y se puede limitar las dlls del .net a las que puede acceder tu assembly, ... oigo la mosca revolotear...  :-X




Vicente

En PC no vas a tener ningún problema, en XBox ya no lo tengo tan claro...

fjfnaranjo

Se que es desviarse de la pregunta... pero, ¿qué tal Lua?

Lua fue de hecho diseñado para lo que tu quieres, y es especialmente sencillo de integrar en C++.
fjfnaranjo.com - Creating entertainment - Creando entretenimiento
fjfnaranjo [4t] gm4il [d0t] c0m (mail y msn)

Warchief

Cita de: chan en 21 de Agosto de 2008, 07:27:52 PM
Buenas!

Hace tiempo que tengo en mente el tema de la arquitectura de aplicaciones "scriptables", pero por el poco tiempo libre que tengo no he podido googlear lo suficiente como para enterarme cómo hacerlo. Mi pregunta es ¿donde podría leer sobre como integrar mis aplicaciones en C++, C# o lo que sea, con scripts que desarrolle (en python por ejemplo)? pensad por ejemplo en que quiera programar la IA de un juego mediante scripts en python y los quiera integrar con un motor de IA hecho en C++ (no se si acabo de decir una burrada)

http://www.google.es/search?hl=e&q=c%2B%2B+python
--> 1º Boost.Python
--> 4º Python incrustado/embebido en C++

------------------
Boost.Python is used as the interface layer between the C++ game code and Python. Python is used for many purposes in the game, including map generation, interface screens, game events, tools, tutorials, etc. Most high-level game operations have been exposed to Python in order to give modders the power they need to customize the game.
    -Mustafa Thamer, Civ4 Lead Programmer
------------------

Prompt

Todo depende de que nivel de programacion de script quieras.

Yo prefiero C++ con LUA, no me gusta python, me parece pesado y encima necesitas la libreria boost. Evidentemente luego tiene sus pros. LUA es más para que te lo implementes tu todo, si quieres refraccion con tu código de C++.

Si usas C# HUYE!! de usar cualquier lenguaje de script por favor. C# se puede usar como lenguaje de script, igual que "compilas" en byte-code LUA o Python para actualizar tus scripts lo mismo haces con C# creando una dll o varias y linkando dinámicamente. Por favor no destroces la maravilla tipo perla que es C# para esas cosas.

A quien use scripts de LUA o Python en C# que sepan que me tienen de enemigo!  >:(

Un saludo!

PD: ver www.runuo.com emulador de servidor de Ultima Online

LC0

Citar
Yo prefiero C++ con LUA, no me gusta python, me parece pesado y encima necesitas la libreria boost.

Que no, que no hace falta Boost por huevos, hombre de Deus-Ex  ;D. Mira el último enlace de Warchief.

De todas formas sí que es verdad eso de que es muy pesado, pero la complejidad de la integración de los scripts, por lo muy poco que he visto con LUA, es similar que con Python.

Warchief

Imagino que usar Boost para Python es como usar Luabind para LUA. Puedes usar la biblioteca y añadir dependencias, o supongo que habrá la forma engorrosa.

Vicente

Cita de: Prompt en 22 de Agosto de 2008, 08:20:10 AM
Si usas C# HUYE!! de usar cualquier lenguaje de script por favor. C# se puede usar como lenguaje de script, igual que "compilas" en byte-code LUA o Python para actualizar tus scripts lo mismo haces con C# creando una dll o varias y linkando dinámicamente. Por favor no destroces la maravilla tipo perla que es C# para esas cosas.

A quien use scripts de LUA o Python en C# que sepan que me tienen de enemigo!  >:(

Estooo, todo lo que cuentas de C# se aplica a todos los demás lenguajes .NET también, con lo que no hay mucho problema en usar lenguajes .NET más orientados a scripting en tus aplicaciones (Ironpython, Boo,...).

Un saludo!

Vicente

Prompt

Cita de: Warchief en 22 de Agosto de 2008, 10:34:17 AM
Imagino que usar Boost para Python es como usar Luabind para LUA. Puedes usar la biblioteca y añadir dependencias, o supongo que habrá la forma engorrosa.

Te "facilita" la vida con C++ y puedes hacer cosas complejas facilmente. Pero yo me he hecho todo el sistema de refraccion en C++ para LUA y sin usar potrocientos megas de la libreria boost.

Digo refracción y no OOP, pq no hago ni herencia ni polimorfismo, que es lo que caracteriza a un OOP :)

Creo objetos desde LUA, que tienen equivalencia en C++ y al revés, por ejemplo con poner una macro en mi ResourceManager, este es accesible desde script como "ResourceManager:addResource(...)" por ejemplo.

Al igual que puedo hacer cosas como:
local pNewResource = ResourceManager:addResource(...)
pNewResource:takeHP(20)

local copiaDelPuntero = pNewResource


Y mil cosas más... que me da la utilidad que necesito. De hecho no quiero ni herencia ni polimorfismo para que la "gente" y yo mismo no me de por volcar lógica de juego o calculos y clases complejisimas a LUA. Por ejemplo hacerse un A* en LUA.

Como hago esto entonces, muy facil, exportando funcionalidad desde los objetos de C++ y funciones globales, tal como:

local radius = 10 -- metros
local tableWithCreatures = getCreaturesInSphere(radius)

tableWithCreatures[1]:goTo(tableWithCreatures[2])


Es como creo yo, bajo mi experiencia como debe de usarse un lenguaje de script. Dar flexibilidad, programar lógica en base a reacciones, eventos etc... No crear nunca eventos que se procesen en cada process / tick del sistema. La performance de la aplicación podría irse a tomar por saco. Y en manos de gente inexperta o con pocos conocimientos de programación significa un desastre total :P

Vease que la gente de otros departamentos, como el de arte que quieran hacerse sus scripts, lo hagan de una manera inadecuada por el simple hecho de que les resulte mas practico o más lógico hacerse ciertas funciones que afectan negativamente al rendimiento / performance de la app.

Saludos!

Prompt

Cita de: Vicente en 22 de Agosto de 2008, 11:02:19 AM
Cita de: Prompt en 22 de Agosto de 2008, 08:20:10 AM
Si usas C# HUYE!! de usar cualquier lenguaje de script por favor. C# se puede usar como lenguaje de script, igual que "compilas" en byte-code LUA o Python para actualizar tus scripts lo mismo haces con C# creando una dll o varias y linkando dinámicamente. Por favor no destroces la maravilla tipo perla que es C# para esas cosas.

A quien use scripts de LUA o Python en C# que sepan que me tienen de enemigo!  >:(

Estooo, todo lo que cuentas de C# se aplica a todos los demás lenguajes .NET también, con lo que no hay mucho problema en usar lenguajes .NET más orientados a scripting en tus aplicaciones (Ironpython, Boo,...).

Un saludo!

Vicente

kk kk y mas que kk :P Yo creo que si usas lenguajes de programación .Net no te hace falta lenguajes de script para nada... de hecho es mucho mejor en todos los aspectos que queramos comparar usar como lenguaje de script C# / .Net

Vicente

Cita de: Prompt en 22 de Agosto de 2008, 11:15:18 AM
kk kk y mas que kk :P Yo creo que si usas lenguajes de programación .Net no te hace falta lenguajes de script para nada... de hecho es mucho mejor en todos los aspectos que queramos comparar usar como lenguaje de script C# / .Net

Pero es que IronPython es un lenguaje de programación .NET. Y Boo. Y IronRuby. Y F#. Y cada uno tiene sus diferencias respecto a C# (cada uno soporta una serie de características diferentes). Si tienes un equipo de scripting que está acostumbrado a Python les va a salir natural usar IronPython que C#. Si son gente acostumbrada a lenguajes funcionales mejor que usen F#, etc etc...

Eso que es una de las grandes ventajas de .NET, pues que se aproveche! :) Un saludo!

Vicente

Ruben

Hi,
hasta donde yo se lo que te ofrece boost es un generador de wrappers de c/c++ a python, que no tiene nada que ver con embeber python en tu aplicacion, aunque es probable que puedas querer hacer las dos cosas. Vamos que extender python es diferente que embeber python.

Si no vas a hacer uso de algun modulo en especial que venga con python, creo que no merece la pena complicarse en embeber python. Yo tiraria por la opcion de Lua, que es muy pero que muy sencillito de embeber. Busca "lua c++ embed" o algo similiar y encontraras docs a patadas o http://www.lua.org/ o http://en.wikipedia.org/wiki/Lua_(programming_language)

Cita de: Prompt en 22 de Agosto de 2008, 11:08:45 AM
Cita de: Warchief en 22 de Agosto de 2008, 10:34:17 AM
Imagino que usar Boost para Python es como usar Luabind para LUA. Puedes usar la biblioteca y añadir dependencias, o supongo que habrá la forma engorrosa.

Te "facilita" la vida con C++ y puedes hacer cosas complejas facilmente.


¿Que cosas complejas puedes hacer facilmente?


Por cierto, aparte del generador de wrappers c++ - python que ofrece boost, hay otros como por ejemplo Swig. Ademas, la opcion de hacertelo tu mismo (no necesitarias boost u otro generador de wrappers) siempre es bastante interesante y por lo menos, si te estas planteando extender python de una forma mas avanzada, es algo a tener en cuenta (control total del wrapper). Luego si realmente te mola python, puede estar muy chulo porque te da un conocimiento sobre lo que esta pasando internamente. Muy recomendable.

Un saludo,
Ruben

davur

#13
Boost no es necesario en ninguno de los dos casos (esto es, Lua y Python), porque ambos lenguajes ofrecen su respectiva API en C. Con ambos lenguajes es posible 'embeber' y 'extender'. Ambos lenguajes tienen proyectos asociados para generar código de binding con C++ en tiempo de compilación (Luabind y Boost.Python), y estos sí cuentan con Boost entre sus "dependencias". Y entrecomillo lo de dependencias porque, en pleno 2008, Boost puede equipararse con la librería estándar en términos de aportaciones fundamentales/necesarias al arsenal de un programador de C++.

En el caso de interacciones medianamente complejas con C++, se hace casi obligado recurrir a Luabind o Boost.Python (o similares), porque el proceso pasa de ser mecánico/tedioso a prácticamente automático (en el caso general). Eso sí, los tiempos de compilación aumentan con estas dos librerías por el uso que hacen de técnicas de metaprogramación.

Prompt

Cita de: Ruben en 22 de Agosto de 2008, 01:53:59 PM


¿Que cosas complejas puedes hacer facilmente?


En luaBind, OOP puro con LUA :), herencia, polimorfismo( y refraccion)






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.