我的应用程序(C#、VS2017)之前针对的是Python3.5.1。我已经将系统更新到Python3.7.1,这会导致PythonEngine.Initialize()应用程序崩溃,而不会抛出异常。
一种互联网建议是在VS中设置Python env,但是这会导致在打开Python/environments时关闭VS2017。我切换到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:
pip安装pythonnet
发布于 2021-10-19 03:42:34
下面是我的PythonNet初始化函数。
我发现,如果不设置PythonEngine.PythonPath,应用程序将立即消亡--为非托管代码的强大而欢呼。您可能还需要手动将Runtime.PythonDLL设置为您希望加载的实际python dll。(即python\python38.dll的路径)
请注意,运行"pip install pythonnet“只安装了从Python加载和使用CLR类型和程序集的功能。要将PythonNet嵌入到C#应用程序中,实际上不需要在Python端安装pythonnet。
此函数使用在启动时设置的一些全局变量。
我还调用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
{
Runtime.PythonDLL = Program.PythonDll;
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);
}
}
https://stackoverflow.com/questions/69339974
复制相似问题