web-dev-qa-db-fra.com

Appelez la fonction Python à partir de c # (.NET)

J'ai Visual Studio 2015 avec mon formulaire principal écrit en C # et à partir de là, j'ai différentes classes écrites en Python (Python normal, pas Iron Python). Comment appeler les fonctions Python à partir de mon code C #?

Je sais qu'il existe de nombreux sujets à ce sujet, mais la plupart d'entre eux sont trop anciens et certaines solutions sont trop difficiles ou impliquent l'utilisation d'un langage intermédiaire comme le C++. 

Voici quelques liens que j'ai trouvés utiles mais que je n'ai pas fournis avec la réponse que je cherchais exactement:

Existe-t-il un moyen simple ou ai-je encore besoin d'une solution de contournement? Et si j'ai besoin d'une solution de contournement, quelle est la plus facile?

8
Morganis

Vous pouvez tout appeler via votre ligne de commande

System.Diagnostics.Process process = new System.Diagnostics.Process();
System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
startInfo.FileName = "cmd.exe";
startInfo.Arguments = "python whatever";
process.StartInfo = startInfo;
process.Start();

Ou mieux encore, appelez simplement Python.exe et transmettez vos fichiers py comme argument:

System.Diagnostics.Process process = new System.Diagnostics.Process();
System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
startInfo.FileName = "Python.exe";
startInfo.Arguments = "yourfile.py";
process.StartInfo = startInfo;
process.Start();
4
Yar

La méthode recommandée consiste à utiliser IronPython . Il existe une autre réponse qui décrit les bases de l'utilisation d'IronPython pour accéder au code Python à partir de C #: Comment appeler une méthode spécifique à partir d'un script Python en C #?

Si IronPython n'est pas un choix, comme vous l'avez mentionné, vous pouvez également exécuter la fonction à partir de la ligne de commande et transmettre les arguments en fonction des besoins. Toutefois, pour toute complexité, cela pourrait se transformer en spaghetti. Voici un exemple de base d’exécution d’une fonction python dans un module directement à partir de la ligne de commande:

python -c 'import foo; print foo.hello()'

Donc, pour exécuter ce qui précède en C #:

System.Diagnostics.Process process = new System.Diagnostics.Process();
System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
startInfo.FileName = "python.exe";
startInfo.Arguments = "-c import foo; print foo.hello()";
process.StartInfo = startInfo;
process.Start();

Notez que si vous essayez de récupérer une valeur de retour, vous devrez dans ce cas imprimer les données sur la console, puis sérialiser la sortie à partir de C # comme bon vous semble. Cela peut être potentiellement problématique si la fonction génère quelque chose sur la console, à moins que vous ne la filtriez ou que vous disposiez d'une option pour supprimer le résultat de cette fonction.

1
Bender the Greatest