J'ai essayé d'exécuter du code Python à partir de .Net en utilisant Pythonnet (édition Hallo World)

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.

environnement

L'environnement utilisé pour le développement, la version de Python et Pythonnet sont les suivants.

Préparation

Tout d'abord, téléchargez le code source complet depuis Pythonnet. Extrayez et ouvrez le dossier contenant pythonnet.sln.

Compiler Pythonnet

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.

Exemple de création de code

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.

Création de projet

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.

Création d'exemple de code Hello World

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,

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

C'est un programme simple qui affiche «Hello World» avec.

Courir

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.

Cause et solution

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)

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>.

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

J'ai essayé d'exécuter du code Python à partir de .Net en utilisant Pythonnet (édition Hallo World)
J'ai essayé d'utiliser l'API UnityCloudBuild de Python
Je souhaite envoyer un e-mail depuis Gmail en utilisant Python.
[Python] J'ai immédiatement essayé d'utiliser l'extension VS Code de Pylance.
J'ai essayé d'accéder aux feuilles de calcul Google en utilisant Python
J'ai essayé d'extraire des caractères des sous-titres (OpenCV: édition tesseract-ocr)
Conversion de Pandas DataFrame en System.Data.DataTable à l'aide de Python pour .NET
J'ai essayé de créer une API list.csv avec Python à partir de swagger.yaml
J'ai essayé d'utiliser la bibliothèque Python de Ruby avec PyCall
J'ai fait un chronomètre en utilisant tkinter avec python
J'ai essayé de changer le script python de 2.7.11 à 3.6.0 sur Windows10
J'ai essayé d'obtenir rapidement des données d'AS / 400 en utilisant pypyodbc
J'ai essayé de toucher Python (installation)
J'ai essayé d'utiliser Thonny (Python / IDE)
Exécuter du code Python à partir de l'interface graphique C #
J'ai essayé de créer une expression régulière de "montant" en utilisant Python
J'ai essayé de créer une expression régulière de "temps" en utilisant Python
J'ai essayé de créer une expression régulière de "date" en utilisant Python
J'ai essayé de créer une application todo en utilisant une bouteille avec python
[Python] J'ai essayé d'obtenir diverses informations en utilisant l'API de données YouTube!
J'ai essayé d'obtenir rapidement des données d'AS / 400 en utilisant pypyodbc Préparation 1
J'ai essayé de résumer la gestion des exceptions Python
J'ai essayé d'implémenter PLSA en Python
J'ai essayé d'utiliser Azure Speech to Text.
Exécuter du code Python sur C ++ (en utilisant Boost.Python)
[Bases de la science des données] J'ai essayé d'enregistrer de csv à mysql avec python
J'ai essayé d'implémenter la permutation en Python
J'ai essayé d'utiliser jpholidayp sur proxy pour exécuter cron uniquement en semaine
J'ai essayé d'implémenter PLSA dans Python 2
Entrée standard Python3 que j'ai essayé de résumer
Je veux utiliser jar de python
[Python] J'ai essayé de reproduire le programme d'évacuation d'urgence pour revenir du monde pour revenir du monde modifié de "La disparition de Haruhi Suzumiya"
J'ai essayé d'utiliser l'optimisation bayésienne de Python
J'ai essayé de classer le texte en utilisant TensorFlow
J'ai essayé d'obtenir le code d'authentification de l'API Qiita avec Python.
J'ai essayé d'implémenter PPO en Python
Précautions et gestion des erreurs lors de l'appel de la DLL .NET à partir de python à l'aide de pythonnet
[Python] J'ai essayé de calculer TF-IDF régulièrement
J'ai essayé de gratter la météo Yahoo (édition Python)
J'ai essayé de toucher Python (syntaxe de base)
J'ai essayé d'utiliser Headless Chrome de Selenium
Programmation Python: j'ai essayé d'obtenir des informations sur l'entreprise (exploration) de Yahoo Finance aux États-Unis en utilisant BeautifulSoup4
[Note] Exécuter du code Python à partir d'Excel (xlwings)
J'ai créé un exemple pour accéder à Salesforce en utilisant Python et Bottle
J'ai essayé de refactoriser le code du modèle publié dans "Obtenir des images de l'API Flickr avec Python" (Partie 2)
J'ai essayé d'analyser la carte du Nouvel An par moi-même en utilisant python
J'ai essayé de résumer les modules d'Ansible - l'édition Linux
J'ai essayé de livrer du courrier depuis Node.js et Python en utilisant le service de livraison de courrier (SendGrid) d'IBM Cloud!
Essayez d'écrire du code à partir de 1 en utilisant le chainer du cadre d'apprentissage automatique (édition mnist)
[Python] J'ai essayé de juger l'image du membre du groupe d'idols en utilisant Keras
[Python] Deep Learning: J'ai essayé d'implémenter Deep Learning (DBN, SDA) sans utiliser de bibliothèque.
J'ai essayé d'utiliser la bibliothèque Python "pykakasi" qui peut convertir des kanji en romaji.
Programmation Python: j'ai essayé d'obtenir (l'exploration) des articles de presse en utilisant Selenium et BeautifulSoup4
J'ai essayé d'utiliser Google Translate à partir de Python et c'était trop facile
[IBM Cloud] J'ai essayé d'accéder à la table Db2 on Cloud à partir de Cloud Funtions (python)
J'ai essayé de refactoriser le code de Python débutant (lycéen)
vprof - J'ai essayé d'utiliser le profileur pour Python
J'ai essayé le web scraping en utilisant python et sélénium
Un débutant en Python a essayé de coder une boisson énergisante