web-dev-qa-db-fra.com

Intégration de python dans l'application C #

J'ai le problème suivant: j'ai une ancienne application écrite en python. Cette application permet à l'utilisateur de spécifier de petites étapes python qui seront exécutées, python sont fondamentalement petites python, Je les appelle des étapes car l'exécution de cette application implique d'autres étapes comme l'exécution de quelque chose à partir de la ligne de commande. Ces étapes python sont stockées sous la forme python code dans un fichier xml).

Maintenant, je veux réécrire l'application en utilisant C # .NET. Existe-t-il une meilleure pratique pour faire quelque chose comme ça?

Je ne veux pas appeler python en tant que programme externe et passer l'étape python (script) réelle à python interprète - Je veux que quelque chose soit intégré. Je suis juste tombé sur IronPython et .NET python mais je ne sais pas trop lequel utiliser. Je veux réaliser une sorte de débogage pour les petits scripts, c'est pourquoi l'appel de la solution interprète n'est pas acceptable.

Ce qui est plus important, c'est que beaucoup de ces scripts existent déjà. Par conséquent, je dois utiliser une implémentation C # de python qui a la même syntaxe que python ainsi que les mêmes bibliothèques intégrées de python. Est-ce même possible ?

Merci et salutations Xeun

14
Xeun

IronPython est ce que vous voulez. Il se compile en bytecode .NET. Vous pouvez raisonnablement facilement appeler python à partir d'un autre langage .NET (et inversement). IronPython est également pris en charge dans Visual Studio, je pense.

12
cdjc

Les scripts Python peuvent être exécutés à partir de C # avec IronPython.

    var ipy = Python.CreateRuntime();
    dynamic test = ipy.UseFile("Test.py");
    test.Simple();

Voir également:

http://putridparrot.com/blog/hosting-ironpython-in-a-c-application/

et

https://blogs.msdn.Microsoft.com/charlie/2009/10/25/running-ironpython-scripts-from-a-c-4-0-program/

3
FrankyHollywood

Vous pouvez utiliser ScriptScope.GetVariable d'IronPython pour obtenir la fonction réelle, puis vous pouvez l'appeler comme une fonction C #. Utilisez-le comme ceci:

Code C #:

var var1, var2 = ...
ScriptEngine engine = Python.CreateEngine();
ScriptScope scope = engine.CreateScope();
engine.ExecuteFile(@"C:\test.py", scope);
dynamic testFunction = scope.GetVariable("test_func");
var result = testFunction(var1,var2);

Code Python:

def test_func(var1,var2):
    ...do something...

Cela m'a pris un certain temps pour enfin le comprendre, et c'est assez simple .. Et IronPython est gratuit et assez facile à utiliser. J'espère que cela t'aides :)

1
LiRoN