升级GitHub中pythonnet的master分支及.NET调用Python代码遇问题
解决pythonnet master分支安装问题及PythonEngine初始化异常
一、正确安装pythonnet master分支
你遇到的git命令未找到以及python/pip路径的问题,完全不需要复制文件到pythonnet目录,按以下步骤操作就能解决:
1. 修复git命令未找到的问题
如果想直接用pip install git+https://github.com/pythonnet/pythonnet安装master分支,核心是让CMD能识别git命令:
- 先确认你已经安装了Git(没装的话先下载官方Git客户端完成安装)
- 找到Git的
cmd目录(通常是C:\Program Files\Git\cmd) - 把这个路径添加到系统环境变量
PATH中,然后彻底重启CMD,这样就能正常执行git相关命令了。
2. 用已克隆的源码编译安装
如果你已经用Git Bash克隆了仓库,直接用Python2.7的绝对路径调用工具即可,不用复制文件:
- 打开CMD,切换到你克隆的pythonnet目录(比如
cd D:\pythonnet) - 执行Python2.7的
setup.py编译生成wheel包:C:\Python27\python.exe setup.py bdist_wheel - 再用对应版本的pip安装生成的wheel包:
这样能确保你用的是Python2.7对应的工具,不会和其他版本的Python产生冲突。C:\Python27\Scripts\pip.exe install --no-index --find-links=./dist/
二、解决PythonEngine.PythonHome抛出的异常
你代码中设置PythonEngine.PythonHome时出现异常,大概率是环境配置或初始化顺序的问题,试试这些排查步骤:
1. 确保环境变量无冲突、路径正确
- 检查
PATH:你已经把C:\Python27加到PATH最前面,这一步很关键,能避免系统误加载其他版本的Python DLL(比如python3x.dll) - 核对
PYTHONHOME和PYTHONPATH的路径,确保没有拼写错误,比如envPythonLib对应的C:\Python27\Lib\site-packages必须真实存在。
2. 调整代码的初始化顺序
尝试修改代码执行顺序,确保PythonEngine的属性设置和初始化流程正确:
string envPythonHome = @"C:\Python27"; string envPythonLib = envPythonHome + @"\Lib\site-packages"; // 设置进程级环境变量 Environment.SetEnvironmentVariable("PYTHONHOME", envPythonHome, EnvironmentVariableTarget.Process); Environment.SetEnvironmentVariable("PATH", envPythonHome + ";" + Environment.GetEnvironmentVariable("PATH", EnvironmentVariableTarget.Machine), EnvironmentVariableTarget.Process); Environment.SetEnvironmentVariable("PYTHONPATH", envPythonLib, EnvironmentVariableTarget.Process); // 先设置PythonEngine的属性,再显式初始化引擎 PythonEngine.PythonHome = envPythonHome; PythonEngine.PythonPath = Environment.GetEnvironmentVariable("PYTHONPATH"); PythonEngine.Initialize(); using (Py.GIL()) { dynamic np = Py.Import("numpy"); Console.WriteLine(np.cos(np.pi * 2)); } // 程序结束时记得关闭引擎 PythonEngine.Shutdown();
3. 检查依赖完整性
- 确认Python2.7已经安装了numpy:打开Python2.7的CMD窗口,执行
pip install numpy确保依赖存在 - 验证pythonnet版本兼容性:master分支理论上支持Python2.7,但如果编译时误用了其他Python版本,会导致不兼容,建议重新编译一次。
如果还是有问题,建议捕获异常并查看具体的错误信息(比如异常的Message和InnerException),这能帮你更精准地定位问题。
内容的提问来源于stack exchange,提问作者SgtMeowBlank
相关产品推荐
相关产品推荐

