.NET 6调用Python yfinance脚本报'NoneType'无flush属性异常求助
解决.NET 6调用Python yfinance时的
NoneType flush异常 问题根源
这个异常通常是因为Python的标准输出/错误流(stdout/stderr)在.NET嵌入环境中未正确初始化,yfinance下载过程中会尝试输出日志或进度信息,导致调用flush()时遇到None对象。另外你的代码中还有几处初始化顺序和参数设置的问题需要调整。
修复步骤
1. 提前设置PYTHONNET_PYDLL环境变量
不要在方法内部设置环境变量,建议在程序启动时(比如Main方法开头)设置,确保Python引擎初始化时能读取到正确的路径:
// 程序启动时设置,而非HistoricalData方法内 Environment.SetEnvironmentVariable("PYTHONNET_PYDLL", @"C:\Python39\python39.dll"); // 替换为你的Python DLL路径
2. 初始化Python标准流
在PythonEngine.Initialize()之后,手动绑定Python的stdout和stderr到.NET的控制台流,避免出现None对象:
PythonEngine.Initialize(); // 绑定标准流 PythonEngine.Out = new StreamWriter(Console.OpenStandardOutput()) { AutoFlush = true }; PythonEngine.Err = new StreamWriter(Console.OpenStandardError()) { AutoFlush = true };
3. 调整线程与GIL的使用
PythonEngine.BeginAllowThreads()不需要在初始化后立即调用,且应确保GIL的正确释放。另外,Python引擎的初始化和关闭最好全局只做一次,不要在每次调用方法时都初始化/关闭,否则会有性能问题和潜在的资源泄漏。
4. 禁用yfinance的进度输出
在yf.download()中添加progress=False参数,避免下载过程中输出进度条,减少触发流操作的概率:
yf.download(ticker, start=start, end=end, progress=False)['Close'].values
修改后的完整代码
// 全局初始化(比如在Program.cs的Main方法中) Environment.SetEnvironmentVariable("PYTHONNET_PYDLL", @"你的Python DLL路径"); PythonEngine.Initialize(); PythonEngine.Out = new StreamWriter(Console.OpenStandardOutput()) { AutoFlush = true }; PythonEngine.Err = new StreamWriter(Console.OpenStandardError()) { AutoFlush = true }; // 你的HistoricalData方法 public void HistoricalData(string ticker, string start, string end) { using (Py.GIL()) { using (PyModule scope = Py.CreateScope()) { scope.Set("path", new PyString(@"保存文件的完整路径,比如C:\data\close_prices.txt")); scope.Set("ticker", new PyString(ticker)); scope.Set("start", new PyString(start)); scope.Set("end", new PyString(end)); string code = @" import numpy as np import yfinance as yf # 禁用进度输出,避免流操作报错 data = yf.download(ticker, start=start, end=end, progress=False) if not data.empty: np.savetxt(path, data['Close'].values, delimiter=';') "; scope.Exec(code); } } } // 程序退出时关闭Python引擎(比如在Main方法末尾) // PythonEngine.Shutdown();
额外注意事项
- 确保你的Python环境中已正确安装
yfinance和numpy:pip install yfinance numpy - Python版本要和PYTHONNET_PYDLL的版本一致(比如Python 3.9对应python39.dll)
- 避免在每次调用方法时重复初始化和关闭Python引擎,全局只做一次即可
内容的提问来源于stack exchange,提问作者Aitor Uaa
相关产品推荐
相关产品推荐

