6 votes

Appeler python script à partir de .Net Core en utilisant pythonnet

J'essaie de faire fonctionner pythonnet dans mon application .Net Core fonctionnant sous Linux.

J'ai fait une référence à Python.Runtime.dll (que j'ai obtenu de nuget ) dans mon projet .Net Core.

Mon code est :

using System;
using Python.Runtime;
namespace pythonnet_w
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Start");
            using (**Py.GIL()**) {
            //     blabla
            }
            Console.WriteLine("End");
        }
    }
}

J'obtiens cette erreur d'exécution :

 Unhandled Exception: System.MissingMethodException: Method not found:     'System.Reflection.Emit.AssemblyBuilder      
 System.AppDomain.DefineDynamicAssembly(System.Reflection.AssemblyName, System.Reflection.Emit.AssemblyBuilderAccess)'.
    at Python.Runtime.CodeGenerator..ctor()
    at Python.Runtime.DelegateManager..ctor()
    at Python.Runtime.PythonEngine.Initialize(IEnumerable`1 args, Boolean setSysArgv)
    at Python.Runtime.PythonEngine.Initialize(Boolean setSysArgv)
    at Python.Runtime.PythonEngine.Initialize()
    at Python.Runtime.Py.GIL()
    at pythonnet_w.Program.Main(String[] args) in D:\Development\~.Net libraries (3.part)\phytonnet\.Net Core test (phytonnet)\c#\pythonnet_test\Program.cs:line 10
 /usr/sbin/pythonnet_w: line 5: 19487 Aborted                 dotnet "/usr/share/pythonnet_wit/pythonnet_w.dll"

J'ai essayé de trouver une solution dans ces fils mais sans succès :

Comment exécuter un fichier py en C# ?

Appeler Python à partir de .NET

UPDATE :

J'ai essayé d'ouvrir \pythonnet -maître \src\runtime **Python.Runtime.csproj** dans Visual Studio pour voir si je peux le compiler en .Net ou .Core, mais je ne peux compiler qu'en .Net. J'ai trouvé cet article " Comment faire un portage de .net framework vers .net standard ? " C'est ce que je dois faire ?

6voto

Drewdin Points 131

J'ai finalement réussi en utilisant une dll Python.Runtime.dll auto-compilée à partir de la version 2.4.0. Il y a deux options pour créer une DLL fonctionnelle :

  • Retirer l'autre cadre cible net461 du fichier de projet respectif (laissant seulement netstandard2.0 ).
  • Exécuter dotnet build en utilisant les options appropriées

Pour l'option 2, les éléments suivants travaux (sous Windows, Mac et Linux) :

  1. Clonez le repo de pythonnet ( https://github.com/pythonnet/pythonnet )

  2. Dans le dossier pythonnet, cd src\runtime

  3. Exécuter dotnet build -c ReleaseWinPY3 -f netstandard2.0 Python.Runtime.15.csproj dans Windows (dans Mac/Linux, remplacez ReleaseWinPY3 con ReleaseMonoPY3 parce que l'ancienne utilisation python37 et l'utilisation ultérieure python3.7 )

  4. Set DYLD_LIBRARY_PATH dans Mac ou LD_LIBRARY_PATH dans linux(Windows skip) :

    export DYLD_LIBRARY_PATH=/Library/Frameworks/Python.framework/Versions/3.7/lib

  5. Utiliser la DLL construite bin\netstandard2.0\Python.Runtime.dll en tant que référence DLL dans votre projet Visual Studio .NET Core (le mien a pour cible netcoreapp2.2 , netcoreapp3.1 est également testé ok), par exemple en conjonction avec le code suivant,

    using System; using Python.Runtime;

    namespace Python_CSharp { class Program { static void Main(string[] args) { using (Py.GIL()) { dynamic os = Py.Import("os"); dynamic dir = os.listdir(); Console.WriteLine(dir);

                foreach (var d in dir)
                {
                    Console.WriteLine(d);
                }
            }
        }
    }

    }

1voto

VISHMAY Points 559

Vous pouvez héberger l'interpréteur IronPython directement dans votre application .NET. Par exemple, à l'aide de NuGet, vous pouvez télécharger le bon paquetage et ensuite intégrer l'exécution du script (en fait le moteur IronPython) directement dans votre application.

Réf : https://medium.com/better-programming/running-python-script-de-c-et-travailler-avec-les-résultats-843e68d230e5

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X