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.
Die für die Entwicklung verwendete Umgebung, die Version von Python und Pythonnet sind wie folgt.
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.
Ö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.
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.
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.
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
Python.Runtime
,PythonEngine.PythonHome = PYTHON_HOME
ist
--Lehre PythonEngine.PythonPath
den Suchpfad von Python
--Initialize with PythonEngine.Initialize ()
NachdemUsing Py.GIL()
PythonEngine.RunSimpleString("import sys")
PythonEngine.RunSimpleString("print(""Hallo World"")")
End Using
Es ist ein einfaches Programm, das Hello World
mit anzeigt.
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.
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>.
x64
</ 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