J'ai appris que je pouvais exécuter Python à partir de .Net sur cet article et utilisé Pythonnet J'ai essayé de le voir. J'étais accro à la hâte, alors je vais l'écrire sous forme de mémorandum.
L'environnement utilisé pour le développement, la version de Python et Pythonnet sont les suivants.
Tout d'abord, téléchargez le code source complet depuis Pythonnet. Extrayez et ouvrez le dossier contenant pythonnet.sln.
Ouvrez le fichier de solution pythonnet.sln.
Le système d'exploitation cible, la version Python, etc. peuvent être déterminés à partir de la structure du projet. --Release WinPy3 (version Windows de la version de la série Python 3) --DebugMono (version mono de la version de débogage de la série Python 2) Il peut être spécifié sous la forme de.
En jouant avec cela, la valeur de définition du "symbole de compilation conditionnelle" du projet est réécrite, et la condition par «# if» dans la source est commutée.
Si vous regardez le code source runtime.cs
, vous pouvez voir qu'il est commuté comme suit.
#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
Avec cela, vous modifiez la différence dans le nom de la DLL Python en fonction du système d'exploitation.
Dans cet environnement, il s'agit de Python 3.8 sur Windows, alors construisez-le avec la configuration de ReleaseWinPY3.
Puisque Python3.8 est utilisé, modifions le contenu de "Symbole de compilation conditionnelle" dans l'élément "Build" de la propriété de Python.Runtime comme PYTHON3; PYTHON38; UCS2
.
La plate-forme Python.Runtime ne peut être sélectionnée qu'à partir de n'importe quel processeur, alors laissez-la telle quelle.
Lorsque vous le construisez, vous aurez bin \ Python.Runtime.dll
, alors copiez-le à l'emplacement de votre choix.
Maintenant que la bibliothèque Pythonnet est prête, créons une application simple du monde Hallo. Faisons-le en nous référant à l'exemple de cet article.
Dans l'article ci-dessus, il est écrit en C #, mais cela est écrit en VB.Net.
Tout d'abord, créez un projet en sélectionnant «Application console (.NET Framework)» dans «Créer un nouveau projet» dans Visual Studio. Ici, .NET Framework 4.7.2 est spécifié comme framework.
Ensuite, sélectionnez "Références" dans les propriétés du projet afin de pouvoir faire référence à Python.Runtime.dll, et spécifiez l'emplacement où Python.Runtime.dll
est placé dans" Ajouter ".
Maintenant, vous êtes prêt à partir.
Après cela, créez l'exemple de code suivant.
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
Quant au contenu,
--Créez une classe d'assistance TestPython
qui ajoute le chemin à la variable d'environnement PATH
--Saisissez le chemin Anaconda dans PYTHON_HOME
--Ajoutez PYTHON_HOME
et PYTHON_HOME \ Library \ bin
à la variable d'environnement PATH
Après avoir fait la préparation, pour Python.Runtime
,
PythonEngine.PythonHome = PYTHON_HOME
--Teach PythonEngine.PythonPath
le chemin de recherche de Python
--Initialiser avec PythonEngine.Initialize ()
Après çaUsing Py.GIL()
PythonEngine.RunSimpleString("import sys")
PythonEngine.RunSimpleString("print(""Hallo World"")")
End Using
C'est un programme simple qui affiche «Hello World» avec.
Alors allons-y.
Exception non-gérée: System.DllNotFoundException: DLL 'python3.8'Ne peut pas être lu:Le module spécifié est introuvable.(Exception de HRESULT:0x8007007E)
L'erreur est que la DLL ne peut pas être chargée.
Pour le moment, je n'écrirai que la cause et la solution.
Quand je l'ai recherché,
--Je cherche python3.8.dll
au lieu de python38.dll
(nommé python38.dll
sous Windows)
Python.Runtime.dll
est construit en tant que x86 </ del>J'ai trouvé que la cause était deux points </ del>.
(Corrigé en commentant le 04/08/2020. C'était correct que Python.Runtime.dll soit construit sur AnyCPU. J'avais l'intention de créer le programme appelant sur x64, mais c'était sur AnyCPU, donc 32 bits Il semble que c'était un appel. Il semble prudent de supprimer AnyCPU du programme appelant au cas où)
Par conséquent, la solution est la suivante deux points </ del>.
WINDOWS
n'est pas défini lors de la construction de Pythonnet, nous recherchons une DLL nommée python3.8.dll
, donc le symbole WINDOWS
est ajouté au "Symbole de compilation conditionnelle" de Python.Runtime. Ajouterx64
</ del>Lorsque je fais référence à la DLL construite de cette manière (il est nécessaire d'exclure l'ancienne DLL, puis de s'y référer à nouveau), le résultat de l'exécution a été obtenu avec succès comme indiqué ci-dessous.
Hallo World
D'une manière ou d'une autre, j'ai eu beaucoup de problèmes avec Hallo World seul, alors cet article se termine ici. J'aimerais écrire le code qui appelle et utilise réellement Python dans le prochain article.
Recommended Posts