171 votes

Comment exécuter un script Python depuis C# ?

Ce genre de question a déjà été posé à des degrés divers, mais j'ai l'impression qu'on n'y a pas répondu de manière concise et je la pose donc à nouveau.

Je veux exécuter un script en Python. Disons que c'est ça :

if __name__ == '__main__':
    with open(sys.argv[1], 'r') as f:
        s = f.read()
    print s

Qui obtient l'emplacement d'un fichier, le lit, puis imprime son contenu. Pas si compliqué.

Ok, alors comment je fais pour exécuter ça en C# ?

C'est ce que j'ai maintenant :

    private void run_cmd(string cmd, string args)
    {
        ProcessStartInfo start = new ProcessStartInfo();
        start.FileName = cmd;
        start.Arguments = args;
        start.UseShellExecute = false;
        start.RedirectStandardOutput = true;
        using (Process process = Process.Start(start))
        {
            using (StreamReader reader = process.StandardOutput)
            {
                string result = reader.ReadToEnd();
                Console.Write(result);
            }
        }
    }

Quand je passe le code.py l'emplacement comme cmd et le filename l'emplacement comme args ça ne marche pas. On m'a dit que je devais passer python.exe comme le cmd et ensuite code.py filename comme le args .

Cela fait un moment que je cherche et je ne trouve que des gens qui suggèrent d'utiliser IronPython ou autre. Mais il doit bien exister un moyen d'appeler un script Python depuis C#.

Quelques précisions :

Je dois l'exécuter à partir de C#, je dois capturer la sortie, et je ne peux pas utiliser IronPython ou autre. Quel que soit le hack que vous avez, ça ira.

P.S. : Le code Python que j'exécute est beaucoup plus complexe que cela, et il renvoie une sortie dont j'ai besoin en C#, et le code C# appellera constamment le code Python.

Faites comme si c'était mon code :

    private void get_vals()
    {
        for (int i = 0; i < 100; i++)
        {
            run_cmd("code.py", i);
        }
    }

153voto

Master Morality Points 1902

La raison pour laquelle ça ne marche pas est que vous avez UseShellExecute = false .

Si vous n'utilisez pas l'interpréteur de commandes, vous devrez fournir le chemin d'accès complet à l'exécutable python en tant que FileName et de construire le Arguments pour fournir à la fois votre script et le fichier que vous voulez lire.

Notez aussi que vous ne pouvez pas RedirectStandardOutput sauf si UseShellExecute = false .

Je ne sais pas exactement comment la chaîne d'arguments doit être formatée pour python, mais vous aurez besoin de quelque chose comme ceci :

private void run_cmd(string cmd, string args)
{
     ProcessStartInfo start = new ProcessStartInfo();
     start.FileName = "my/full/path/to/python.exe";
     start.Arguments = string.Format("{0} {1}", cmd, args);
     start.UseShellExecute = false;
     start.RedirectStandardOutput = true;
     using(Process process = Process.Start(start))
     {
         using(StreamReader reader = process.StandardOutput)
         {
             string result = reader.ReadToEnd();
             Console.Write(result);
         }
     }
}

68voto

Chris Dunaway Points 3880

Si vous êtes prêt à utiliser IronPython, vous pouvez exécuter des scripts directement en C# :

using IronPython.Hosting;
using Microsoft.Scripting.Hosting;

private static void doPython()
{
    ScriptEngine engine = Python.CreateEngine();
    engine.ExecuteFile(@"test.py");
}

Téléchargez IronPython ici.

37voto

Rohit Salunke Points 651

Exécuter le script Python depuis C

Créez un projet C# et écrivez le code suivant.

using System;
using System.Diagnostics;
using System.IO;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            run_cmd();
        }

        private void run_cmd()
        {

            string fileName = @"C:\sample_script.py";

            Process p = new Process();
            p.StartInfo = new ProcessStartInfo(@"C:\Python27\python.exe", fileName)
            {
                RedirectStandardOutput = true,
                UseShellExecute = false,
                CreateNoWindow = true
            };
            p.Start();

            string output = p.StandardOutput.ReadToEnd();
            p.WaitForExit();

            Console.WriteLine(output);

            Console.ReadLine();

        }
    }
}

Python sample_script

print "Python C# Test"

Vous verrez le Test Python C# dans la console de C#.

20voto

Derek Points 143

J'ai rencontré le même problème et la réponse de Maître Moralité ne m'a pas suffi. Ce qui suit, qui est basé sur la réponse précédente, a fonctionné :

private void run_cmd(string cmd, string args)
{
 ProcessStartInfo start = new ProcessStartInfo();
 start.FileName = cmd;//cmd is full path to python.exe
 start.Arguments = args;//args is path to .py file and any cmd line args
 start.UseShellExecute = false;
 start.RedirectStandardOutput = true;
 using(Process process = Process.Start(start))
 {
     using(StreamReader reader = process.StandardOutput)
     {
         string result = reader.ReadToEnd();
         Console.Write(result);
     }
 }
}

Par exemple, cmd serait @C:/Python26/python.exe et les args seraient C://Python26//test.py 100 si vous vouliez exécuter test.py avec l'argument 100 de la ligne cmd. Notez que le chemin du fichier .py ne comporte pas le symbole @.

5voto

Daulmalik Points 59

En fait, il est assez facile de faire une intégration entre Csharp (VS) et Python avec IronPython. Ce n'est pas très complexe... Comme Chris Dunaway l'a déjà dit dans la section réponse, j'ai commencé à construire cette intégration pour mon propre projet. C'est assez simple. Il suffit de suivre ces étapes et vous obtiendrez vos résultats.

étape 1 : Ouvrez VS et créez un nouveau projet ConsoleApp vide.

étape 2 : Allez dans Outils --> NuGet Package Manager --> Package Manager Console.

étape 3 : Après cela, ouvrez ce lien dans votre navigateur et copiez la commande NuGet. Lien : https://www.nuget.org/packages/IronPython/2.7.9

étape 4 : Après avoir ouvert le lien ci-dessus, copiez la commande PM>Install-Package IronPython -Version 2.7.9 et collez-la dans la console NuGet de VS. Cela installera les paquets nécessaires.

étape 5 : Voici le code que j'ai utilisé pour exécuter un fichier .py stocké dans mon répertoire Python.exe. dans mon répertoire.

using IronPython.Hosting;//for DLHE
using Microsoft.Scripting.Hosting;//provides scripting abilities comparable to batch files
using System;
using System.Diagnostics;
using System.IO;
using System.Net;
using System.Net.Sockets;
class Hi
{
private static void Main(string []args)
{
Process process = new Process(); //to make a process call
ScriptEngine engine = Python.CreateEngine(); //For Engine to initiate the script
engine.ExecuteFile(@"C:\Users\daulmalik\AppData\Local\Programs\Python\Python37\p1.py");//Path of my .py file that I would like to see running in console after running my .cs file from VS.//process.StandardInput.Flush();
process.StandardInput.Close();//to close
process.WaitForExit();//to hold the process i.e. cmd screen as output
}
} 

étape 6 : sauvegarder et exécuter le code

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X