本地环境:
win10,.NET Core 6,Python 3.9.13,pythonnet 3.0.3
测试的包:biopython 1.82,matplotlib 3.5.2
参考:
GitHub - pythonnet/pythonnet: Python for .NET is a package that gives Python programmers nearly seamless integration with the .NET Common Language Runtime (CLR) and provides a powerful application scripting tool for .NET developers.
https://github.com/pythonnet/pythonnet
Python for .NET — pythonnet 2.4.0 文档
https://dev.listera.top/docs/pythonnet/pythonnet.github.io.html
C#/.net程序调用python - 步、步、为营 - 博客园
https://www.cnblogs.com/qsnn/p/17168273.html
Python报错"it could not find or load the Qt platform plugin “windows”-CSDN博客
https://blog.csdn.net/u011732358/article/details/103065543
目录
- 问题描述
- 安装
- 使用
- 报错
- 找不到包
- cannot find or load the Qt platform plugin
- 查找python包的安装位置
问题描述
为了跟同事对接,需要在C#里调用python脚本。
之前写过一篇C#调用python的,但是IronPython调用第三方库有问题,当时是使用远程调用的办法。
c#远程调用linux服务器的Python脚本_c#远程登录其他服务器执行脚本-CSDN博客
https://blog.csdn.net/pxy7896/article/details/121473815
现在有了一个更好的工具pythonnet。
它的优势是可以直接在C#代码里调用本地python脚本,而这个脚本可以放在任何位置,并且可以使用第三方库。我测试用的脚本用到biopython包解析文件,然后使用matplotlib包绘制图像,输出完全符合预期。
安装
在.Net 项目中使用NuGet安装包:
使用
在项目的入口里写:
static void Main() {string pathToVirtualEnv = "D:\\ProgramData\\Anaconda3";Runtime.PythonDLL = Path.Combine(pathToVirtualEnv, "python39.dll");PythonEngine.PythonHome = Path.Combine(pathToVirtualEnv, "python.exe");PythonEngine.PythonPath = "path/to/脚本;xxx/xxx/xxx";PythonEngine.Initialize();using (Py.GIL()){// 基础测试//dynamic hello = Py.Import("test");//hello.hello();// 测试numpy//dynamic np = Py.Import("numpy");//Console.WriteLine(np.cos(np.pi * 2));// 真实测试dynamic draw = Py.Import("drawABI");draw.drawGraph("path/to/ab1/xx.ab1", "313", "path/to/out.png");}}
注意:
pathToVirtualEnv
是python解释器所在的位置,可以使用虚拟环境,方便管理;PythonEngine.PythonPath
里写的是:a)要执行的脚本的位置;b)python包的位置。如果有找不到包的情况,我的解决方案是把sys.path
里所有的路径都加到这里。路径之间用;
分割;- 基础测试里,我是将一个叫test.py的脚本放在
path/to/脚本
路径下,其内容如下:
所以正确执行的话,控制台会打印sys.pathpython">def hello():import sysprint(sys.path)
- numpy就是调用numpy做计算,正确执行的话,输出1.0
- 真实测试是,我有一个脚本叫drawABI,也放在
path/to/脚本
路径下,其中包含一个函数drawGraph
,接收三个参数,最终输出一副图像out.png。
报错
找不到包
首先检查是否正确安装了。如果c#外可以正常执行,那么可以考虑将sys.path
里所有路径都加入PythonEngine.PythonPath
。
正常来说是将Lib
和Lib\site-packages
加入就可以了,不过我把所有加入了才解决问题。。可能是我的biopython装得位置比较奇怪。
cannot find or load the Qt platform plugin
这个一般是PyQt5
没装好。
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyqt5
python_84">查找python包的安装位置
# 没安装好
pip show PyQt5
WARNING: Package(s) not found: PyQt5# 安装好了
(base) C:\Users\xxx>pip show biopython
Name: biopython
Version: 1.82
Summary: Freely available tools for computational molecular biology.
Home-page: https://biopython.org/
Author: The Biopython Contributors
Author-email: biopython@biopython.org
License:
Location: c:\users\xxxx\site-packages
Requires: numpy
Required-by: