pythonnet-C#调用python脚本-含matplotlib+biopython

本地环境:
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");
        }
	}

注意:

  1. pathToVirtualEnv是python解释器所在的位置,可以使用虚拟环境,方便管理;
  2. PythonEngine.PythonPath里写的是:a)要执行的脚本的位置;b)python包的位置。如果有找不到包的情况,我的解决方案是把sys.path里所有的路径都加到这里。路径之间用;分割;
  3. 基础测试里,我是将一个叫test.py的脚本放在path/to/脚本路径下,其内容如下:
    def hello():
    	import sys
    	print(sys.path)
    
    所以正确执行的话,控制台会打印sys.path
  4. numpy就是调用numpy做计算,正确执行的话,输出1.0
  5. 真实测试是,我有一个脚本叫drawABI,也放在path/to/脚本路径下,其中包含一个函数drawGraph,接收三个参数,最终输出一副图像out.png。

报错

找不到包

首先检查是否正确安装了。如果c#外可以正常执行,那么可以考虑将sys.path里所有路径都加入PythonEngine.PythonPath

正常来说是将LibLib\site-packages加入就可以了,不过我把所有加入了才解决问题。。可能是我的biopython装得位置比较奇怪。

cannot find or load the Qt platform plugin

pythonnet-C#调用python脚本-含matplotlib+biopython_第1张图片
这个一般是PyQt5没装好。

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyqt5

查找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: [email protected]
License:
Location: c:\users\xxxx\site-packages
Requires: numpy
Required-by:

你可能感兴趣的:(c#和WPF,python大法好,c#,python,matplotlib,生物信息)