Python-Pakete aus C# aufrufen

Python in C/C++ embedden, C-Module, ctypes, Cython, SWIG, SIP etc sind hier richtig.
Antworten
CSI
User
Beiträge: 2
Registriert: Dienstag 26. Februar 2019, 10:13

Hallo,

ich möchte ein Python-Programm aus C# aufrufen. Dazu nutze ich derzeit Visual Studio und Ironpython. Solange ich in mein Python-Programm einfach nur print("Hello World") schreibe, funktioniert dies auch einwandfrei. Wenn mein Pythonprogramm jedoch Imports von Paketen enthält, funktioniert dies nicht mehr. Dann bekomme ich Fehlermeldungen wie "no module named numpy" und es bricht ab. Weiß jemand, wie ich die Pakete importieren kann? Es muss nicht zwangsläufig mit Ironpython sein, da habe ich schon viel gelesen und bin nun gar nicht mehr sicher, ob es damit überhaupt geht.

Über Hilfe wäre ich sehr dankbar. Hier mein aktueller Code:

test.py:

Code: Alles auswählen

import numpy as np
a = np.sum([1, 2])
print(a)
program.cs:

Code: Alles auswählen

using IronPython.Hosting;
namespace RunExternalScript
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            Python.CreateEngine().ExecuteFile("D:/test.py");
        }
    }
}
__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das geht so nicht, weil numpy nur fuer CPython verfuegbar ist. Also den "originalen" Interpreter. IronPython ist eine alternative Implementierung, die eben auf der CLR basiert, so wie Jython fuer die JVM gedacht ist. Aber damit verlierst du die Moeglichkeit, in C/C++ geschriebene Erweiterungen wie numpy zu benutzen.

Wenn du das willst, musst du stattdessen Standard-CPython nehmen, und per Interprozess-Kommunikation arbeiten.
CSI
User
Beiträge: 2
Registriert: Dienstag 26. Februar 2019, 10:13

Hallo deets,

danke für deine Rückmeldung. Dann hab ich das also richtig befürchtet. Ich bin leider absolute Anfängerin, kannst du nochmal kurz erläutern, was du meinst, wie ich es alternativ machen muss? CPython hab ich immer mal wieder gelesen, war aber verwirrt davon, dass es hieß, dass das auch Python genannt wird. Mir ist der Unterschied da nicht ganz klar...
__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

Na in deinem eigenen Oekosystem gibt's das doch auch - VisualBasic war mal eine fuer sich stehende Sprache (und ist es immer noch), und dann gibt's halt VB.NET. Genauso wie C++ und managed C++ zwei Abwandlungen der gleichen Sprach sind, die sich zur Laufzeit aber massiv unterscheiden und man zB BOOST oder so nicht in managed C++ benutzen kann.

Und was du machen musst haengt davon ab, was du machen *willst*. Wenn du einfach nur eine klar umrissene Aufgabe hast, bei der dann am Ende ein simples Ergebnis steht, dann kannst du einfach ein Python-Skript per Unterprozess starten (das geht zB hiermit https://docs.microsoft.com/en-us/dotnet ... work-4.7.2) - und dann rechnet das rum, und liefert zB eine Datei mit einem Ergebnis ab.

Wenn du aber die ganze Zeit Daten in ein laufendes Programm fuettern musst, und immer wieder Zwischenergebnisse abholen, dann muss es etwas komplizierter werden.
Antworten