Python.Net PythonEngine.Initialize()使应用程序崩溃而不抛出异常



我的应用程序(c#, VS2017)以前针对Python 3.5.1。我已经将系统更新到Python 3.7.1,并且这导致PythonEngine.Initialize()在不抛出异常的情况下崩溃应用程序。

一个互联网建议是在VS中设置Python环境,但是这会导致VS2017在打开Python/环境时关闭。我切换到VS2019,遇到了同样的问题与剥离代码在这里:

using System.Windows.Forms;
using Python.Runtime;
namespace WindowsFormsApp3
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
try
{
PythonEngine.Initialize();
}
catch (Exception e)
{
string ex = e.ToString();
}
}
}
}

Python。Net已成功安装:

安装pythonnet

UPDATE Dec 2022

有两个可选的环境字符串可以用来定位python dll。

PYTHONNET_PYDLL explicitly set the dll name
PYTHONNET_PYVER explicitly set just the version string part of the dll name

不再需要使用WINDOWS, OSX或LINUX定义编译

这是我的PythonNet init函数。

注意运行"pip install pythonnet"只安装加载&使用CLR类型&程序集。要在c#应用中嵌入PythonNet,实际上不需要在Python端安装PythonNet。

这个函数使用一些在启动时设置的全局变量。

  • 程序。PythonHome——指向我正在使用的Python根目录
  • 程序。ScriptsDir——我自己的应用python脚本目录
  • 程序。ApplicationName——只是我自己的应用名称

我也调用PythonEngine.BeginAllowThreads();当我从多个线程调用时。

public static void InitPython(Microsoft.Extensions.Logging.ILogger logger)
{
string py_home = Program.PythonHome;
string py_path = $"{py_home};";
// will be different on linux/mac
string[] py_paths = {"DLLs", "lib", "lib/site-packages", "lib/site-packages/win32"
, "lib/site-packages/win32/lib", "lib/site-packages/Pythonwin" };
foreach (string p in py_paths)
{
py_path += $"{py_home}/{p};";
}
try
{
PythonEngine.PythonPath = $"{Program.ScriptsDir};{py_path}";
PythonEngine.PythonHome = Program.PythonHome;
PythonEngine.ProgramName = Program.ApplicationName;
PythonEngine.Initialize();
PythonEngine.BeginAllowThreads();
logger.LogInformation("Python Version: {v}, {dll}", PythonEngine.Version.Trim(), Runtime.PythonDLL);
logger.LogInformation("Python Home: {home}", PythonEngine.PythonHome);
logger.LogInformation("Python Path: {path}", PythonEngine.PythonPath);
}
catch (System.TypeInitializationException e)
{
throw new Exception($"FATAL, Unable to load Python, dll={Runtime.PythonDLL}", e);
}
catch (Exception e)
{
throw new Exception($"Python initialization Exception, {e.Message}", e);
}
}

检查您的机器是否安装了python。

最新更新