Ich habe versucht, Python-Code aus .Net mit Pythonnet auszuführen (Hallo World Edition)

Ich habe gelernt, dass ich Python aus .Net unter diesem Artikel ausführen kann, und habe Pythonnet verwendet. Ich habe versucht, es zu sehen. Ich war süchtig nach Eile, deshalb werde ich es als Memorandum aufschreiben.

Umgebung

Die für die Entwicklung verwendete Umgebung, die Version von Python und Pythonnet sind wie folgt.

Vorbereitung

Laden Sie zunächst den vollständigen Quellcode von [Pythonnet] herunter (https://github.com/pythonnet/pythonnet). Extrahieren und öffnen Sie den Ordner mit pythonnet.sln.

Pythonnet kompilieren

Öffnen Sie die Lösungsdatei pythonnet.sln.

Das Zielbetriebssystem, die Python-Version usw. können aus der Projektstruktur ermittelt werden.

Durch das Spielen damit wird der Definitionswert des "bedingten Kompilierungssymbols" des Projekts neu geschrieben und die Bedingung durch "# if" in der Quelle wird umgeschaltet.

Wenn Sie sich den Quellcode runtime.cs ansehen, können Sie sehen, dass er wie folgt umgeschaltet wird.

#if PYTHON34
        const string _minor = "4";
#elif PYTHON35
        const string _minor = "5";
#elif PYTHON36
        const string _minor = "6";
#elif PYTHON37
        const string _minor = "7";
#elif PYTHON38
        const string _minor = "8";
#else
#error You must define one of PYTHON34 to PYTHON38
#endif

#if WINDOWS
        internal const string dllBase = "python3" + _minor;
#else
        internal const string dllBase = "python3." + _minor;
#endif

Damit wechseln Sie den Unterschied im Namen der Python-DLL je nach Betriebssystem.

In dieser Umgebung ist es Python 3.8 unter Windows. Erstellen Sie es daher mit der Konfiguration von ReleaseWinPY3. Da Python3.8 verwendet wird, ändern wir den Inhalt des Symbols "Bedingte Kompilierung" im Element "Build" der Eigenschaft von Python.Runtime in "PYTHON3; PYTHON38; UCS2`".

Die Plattform von Python.Runtime kann nur aus einer beliebigen CPU ausgewählt werden. Lassen Sie sie also unverändert.

Wenn Sie es erstellen, haben Sie "bin \ Python.Runtime.dll", also kopieren Sie es an einen beliebigen Ort.

Beispielcodeerstellung

Nachdem die Pythonnet-Bibliothek fertig ist, erstellen wir eine einfache Hallo-Welt-App. Machen wir es anhand des Beispiels in diesem Artikel.

Im obigen Artikel ist es in C # geschrieben, aber dies ist in VB.Net geschrieben.

Projekterstellung

Erstellen Sie zunächst ein Projekt, indem Sie in Visual Studio unter "Neues Projekt erstellen" die Option "Konsolen-App (.NET Framework)" auswählen. Hier wird .NET Framework 4.7.2 als Framework angegeben.

Wählen Sie dann "Referenzen" aus den Projekteigenschaften aus, damit Sie auf Python.Runtime.dll verweisen können, und geben Sie den Speicherort an, an dem "Python.Runtime.dll" unter "Hinzufügen" platziert wird.

Jetzt können Sie loslegen.

Hello World Beispielcodeerstellung

Erstellen Sie anschließend den folgenden Beispielcode.

Imports Python.Runtime
Imports System
Imports System.IO
Imports System.Linq

Class TestPython
    Public Sub AddEnvPath(paths As String())
        Dim envPaths As IList(Of String) = Environment.GetEnvironmentVariable("PATH").Split(Path.PathSeparator.ToString).ToList

        For Each path In paths
            If path.Length > 0 And Not envPaths.Contains(path) Then
                envPaths.Insert(0, path)
            End If
        Next
        Environment.SetEnvironmentVariable("PATH", String.Join(Path.PathSeparator.ToString, envPaths), EnvironmentVariableTarget.Process)
    End Sub
End Class

Module Module1

    Sub Main()
        Dim test_python = New TestPython

        Dim PYTHON_HOME = "C:\Users\xxx\anaconda3\envs\Python38"

        vms_python.AddEnvPath({PYTHON_HOME,
                               Path.Combine(PYTHON_HOME, "Library\bin")})

        PythonEngine.PythonHome = PYTHON_HOME

        Dim python_paths() As String = {PythonEngine.PythonPath, Path.Combine(PYTHON_HOME, "Lib\site-packages"), Path.Combine("C:\tmp")}
        PythonEngine.PythonPath = String.Join(Path.PathSeparator.ToString, python_paths)

        PythonEngine.Initialize()

        Using Py.GIL()
            PythonEngine.RunSimpleString("import sys")
            PythonEngine.RunSimpleString("print(""Hallo World"")")
        End Using

    End Sub

End Module

Was den Inhalt betrifft, --Erstellen Sie eine Hilfsklasse "TestPython", die den Pfad zur Umgebungsvariablen "PATH" hinzufügt --Geben Sie den Anaconda-Pfad in PYTHON_HOME ein

Using Py.GIL()
    PythonEngine.RunSimpleString("import sys")
    PythonEngine.RunSimpleString("print(""Hallo World"")")
End Using

Es ist ein einfaches Programm, das Hello World mit anzeigt.

Lauf

Also lass es uns laufen.

Unbehandelte Ausnahme: System.DllNotFoundException: DLL 'python3.8'Kann nicht gelesen werden:Das angegebene Modul wurde nicht gefunden.(Ausnahme von HRESULT:0x8007007E)

Der Fehler ist, dass die DLL nicht geladen werden kann.

Ursache und Lösung

Vorerst werde ich nur die Ursache und Lösung schreiben.

Als ich es nachgeschlagen habe,

Ich fand, dass die Ursache zwei Punkte </ del> war. (Behoben durch Kommentieren am 04.08.2020. Es war in Ordnung, dass Python.Runtime.dll auf AnyCPU erstellt wurde. Ich wollte das aufrufende Programm auf x64 erstellen, aber es war auf AnyCPU, also 32 Bit Es scheint, dass es ein Aufruf war. Es scheint sicher, AnyCPU des aufrufenden Programms für alle Fälle zu löschen.

Daher ist die Lösung die folgenden zwei Punkte </ del>.

Wenn ich auf die auf diese Weise erstellte DLL verweise (es ist erforderlich, die alte DLL auszuschließen und dann erneut darauf zu verweisen), wurde das Ausführungsergebnis wie unten gezeigt erfolgreich erhalten.

Hallo World

Irgendwie hatte ich allein mit Hallo World große Probleme, daher endet dieser Artikel hier. Ich möchte im nächsten Artikel den Code schreiben, der Python tatsächlich aufruft und verwendet.

Recommended Posts

Ich habe versucht, Python-Code aus .Net mit Pythonnet auszuführen (Hallo World Edition)
Ich habe versucht, die UnityCloudBuild-API von Python zu verwenden
Ich möchte mit Python eine E-Mail von Google Mail senden.
[Python] Ich habe sofort versucht, die VS-Code-Erweiterung von Pylance zu verwenden.
Ich habe versucht, mit Python auf Google Spread Sheets zuzugreifen
Ich habe versucht, Zeichen aus Untertiteln zu extrahieren (OpenCV: tesseract-ocr edition)
Konvertieren Sie mit Python für .NET von Pandas DataFrame in System.Data.DataTable
Ich habe versucht, API list.csv mit Python aus swagger.yaml zu erstellen
Ich habe versucht, die Python-Bibliothek von Ruby mit PyCall zu verwenden
Ich habe eine Stoppuhr mit tkinter mit Python gemacht
Ich habe versucht, das Python-Skript unter Windows 10 von 2.7.11 auf 3.6.0 zu ändern
Ich habe versucht, mit pypyodbc schnell Daten von AS / 400 abzurufen
Ich habe versucht, Python zu berühren (Installation)
Ich habe versucht, Thonny (Python / IDE) zu verwenden.
Führen Sie Python-Code über die C # -GUI aus
Ich habe versucht, mit Python einen regulären Ausdruck für "Betrag" zu erstellen
Ich habe versucht, mit Python einen regulären Ausdruck von "Zeit" zu erstellen
Ich habe versucht, mit Python einen regulären Ausdruck von "Datum" zu erstellen
Ich habe versucht, eine ToDo-App mit einer Flasche mit Python zu erstellen
[Python] Ich habe versucht, mithilfe der YouTube-Daten-API verschiedene Informationen abzurufen!
Ich habe versucht, mit pypyodbc Preparation 1 schnell Daten von AS / 400 abzurufen
Ich habe versucht, die Behandlung von Python-Ausnahmen zusammenzufassen
Ich habe versucht, PLSA in Python zu implementieren
Ich habe versucht, Azure Speech to Text zu verwenden.
Führen Sie Python-Code unter C ++ aus (mit Boost.Python).
[Data Science-Grundlagen] Ich habe versucht, mit Python von CSV auf MySQL zu speichern
Ich habe versucht, Permutation in Python zu implementieren
Ich habe versucht, jpholidayp über Proxy zu verwenden, um cron nur an Wochentagen auszuführen
Ich habe versucht, PLSA in Python 2 zu implementieren
Python3-Standardeingabe habe ich versucht zusammenzufassen
Ich möchte ein Glas aus Python verwenden
[Python] Ich habe versucht, das Fluchtprogramm zu reproduzieren, um aus der Welt zurückzukehren und aus der modifizierten Welt von "Das Verschwinden von Haruhi Suzumiya" zurückzukehren.
Ich habe versucht, die Bayes'sche Optimierung von Python zu verwenden
Ich habe versucht, Text mit TensorFlow zu klassifizieren
Ich habe versucht, den Authentifizierungscode der Qiita-API mit Python abzurufen.
Ich habe versucht, PPO in Python zu implementieren
Vorsichtsmaßnahmen und Fehlerbehandlung beim Aufrufen der .NET-DLL aus Python mit Pythonnet
[Python] Ich habe versucht, TF-IDF stetig zu berechnen
Ich habe versucht, Yahoo Wetter zu kratzen (Python Edition)
Ich habe versucht, Python zu berühren (grundlegende Syntax)
Ich habe versucht, Headless Chrome von Selenium zu verwenden
Python-Programmierung: Ich habe versucht, mithilfe von BeautifulSoup4 Unternehmensinformationen (Crawlen) von Yahoo Finance in den USA abzurufen
[Hinweis] Führen Sie Python-Code aus Excel aus (xlwings)
Ich habe ein Beispiel für den Zugriff auf Salesforce mit Python und Bottle erstellt
Ich habe versucht, den unter "Abrufen von Bildern von der Flickr-API mit Python" (Teil 2) veröffentlichten Vorlagencode zu überarbeiten.
Ich habe versucht, die Neujahrskarte selbst mit Python zu analysieren
Ich habe versucht, Ansibles Module-Linux-Edition zusammenzufassen
Ich habe versucht, E-Mails von Node.js und Python mithilfe des E-Mail-Zustelldienstes (SendGrid) von IBM Cloud zuzustellen!
Versuchen Sie, Code aus 1 mit dem Framework Chainer für maschinelles Lernen (Mnist Edition) zu schreiben.
[Python] Ich habe versucht, das Mitgliederbild der Idolgruppe mithilfe von Keras zu beurteilen
[Python] Deep Learning: Ich habe versucht, Deep Learning (DBN, SDA) ohne Verwendung einer Bibliothek zu implementieren.
Ich habe versucht, die Python-Bibliothek "pykakasi" zu verwenden, die Kanji in Romaji konvertieren kann.
Python-Programmierung: Ich habe versucht, Nachrichtenartikel mit Selenium und BeautifulSoup4 abzurufen (zu crawlen)
Ich habe versucht, Google Translate aus Python zu verwenden, und es war einfach zu einfach
[IBM Cloud] Ich habe versucht, über Cloud Funtions (Python) auf die Tabelle Db2 on Cloud zuzugreifen.
Ich habe versucht, den Code des Python-Anfängers (Schüler der Mittelstufe) zu überarbeiten.
vprof - Ich habe versucht, den Profiler für Python zu verwenden
Ich habe versucht, Web-Scraping mit Python und Selen
Python-Anfänger haben versucht, einen Energy-Drink zu codieren