henon / Python.Included

A Python.NET based framework enabling .NET libraries to call into Python packages without depending on a local Python installation.
MIT License
325 stars 52 forks source link

Python.Runtime.BadPythonDllException #54

Open woaidianqian opened 1 year ago

woaidianqian commented 1 year ago

using System; using System.IO; using System.Threading.Tasks; using Python.Runtime;

namespace Python.Deployment.Download { class Program { static async Task Main(string[] args) { // ================================================ // This example demonstrates how to download a Python distribution (v2.7.9) and install it locally // ================================================

        // set the download source
        Python.Deployment.Installer.Source = new Deployment.Installer.DownloadInstallationSource()
        {
            DownloadUrl = @"https://www.python.org/ftp/python/3.7.3/python-3.7.3-embed-amd64.zip",
        };

        // install in local directory. if you don't set it will install in local app data of your user account
        Python.Deployment.Installer.InstallPath = Path.GetFullPath(".");

        // see what the installer is doing
        Python.Deployment.Installer.LogMessage += Console.WriteLine;

        // install from the given source
        await Python.Deployment.Installer.SetupPython();

        // ok, now use pythonnet from that installation
        PythonEngine.Initialize();

        // call Python's sys.version to prove we are executing the right version
        dynamic sys=Py.Import("sys");
        Console.WriteLine("### Python version:\n\t" + sys.version);

        // call os.getcwd() to prove we are executing the locally installed embedded python distribution
        dynamic os = Py.Import("os");
        Console.WriteLine("### Current working directory:\n\t" + os.getcwd());
        Console.WriteLine("### PythonPath:\n\t" + PythonEngine.PythonPath);

    }
}

}

PythonEngine.Initialize(); error!!!

Python.Runtime.BadPythonDllException:“Runtime.PythonDLL was not set or does not point to a supported Python runtime DLL. See https://github.com/pythonnet/pythonnet#embedding-python-in-net

henon commented 1 year ago

did you compile this for x86 ?

henon commented 1 year ago

You may have to set this image

woaidianqian commented 1 year ago

image I have already set it to x64, but the problem still persists. If I don't specify the Python version, it will automatically download Python 3.11 without any error. However, when I specify the Python version, it throws an error.

woaidianqian commented 1 year ago
using System;
using System.Threading.Tasks;
using Python.Included;
using Python.Runtime;

namespace NetCoreExample
{
    class Program
    {
        static async Task Main(string[] args)
        {
            await Installer.SetupPython();
            PythonEngine.Initialize();
            dynamic sys=PythonEngine.ImportModule("sys");
            Console.WriteLine("Python version: " + sys.version);
        }
    }
}
dynamic sys=PythonEngine.ImportModule("sys");

The last line should be changed to:

dynamic sys=Py.Import("sys")
henon commented 1 year ago

and that solves it?

woaidianqian commented 1 year ago

There is no error when the program automatically downloads python, and if you want to set the python version by yourself, it is still not solved

henon commented 1 year ago

I guess the newer version of pythonnet doesn't work with old python versions any more?