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

server/2024/11/15 2:05:40/

本地环境:
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. pathToVirtualEnvpython解释器所在的位置,可以使用虚拟环境,方便管理;
  2. PythonEngine.PythonPath里写的是:a)要执行的脚本的位置;b)python包的位置。如果有找不到包的情况,我的解决方案是把sys.path里所有的路径都加到这里。路径之间用;分割;
  3. 基础测试里,我是将一个叫test.py的脚本放在path/to/脚本路径下,其内容如下:
    python">def hello():import sysprint(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

在这里插入图片描述
这个一般是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:

http://www.ppmy.cn/server/109870.html

相关文章

组播(UDP)

1.UDP协议 学习组播就必须先了解UDP。UDP(用户数据报协议,User Datagram Protocol)是一种传输层协议,属于TCP/IP协议族的一部分。它提供了一种简单而高效的方式来在网络上发送数据,但与TCP(传输控制协议)相比,UDP提供的服务具有不…

测试.net core服务项目调用dotNetify-Pulse监控性能的基本用法

微信公众号“DotNet讲堂”的文章《开源 .NET API 实时监控项目》介绍了开源实时日志及性能监控项目dotNetify-Pulse,在项目中引用简单,既能用其自带的监控页面,也支持按需配置监控页面。本文在之前创建的环境检测项目中添加并测试dotNetify-P…

Qt5.15.x之后的版本源码编译安装

在以下网站现在源文件 https://mirrors.tuna.tsinghua.edu.cn/qt/进入网站后选择以下路径 archive/qt/5.15/5.15.8/该路径下 single中是完整qt源码 submodules是各单个模块源码 一、安装基础依赖,此处需要慎重安装,因为分析部分Debian系统和麒麟系统和…

更改网络ip地址时出现错误怎么办

在日常的网络使用中,‌有时我们需要更改IP地址以满足特定的网络需求,‌然而,‌在更改IP地址的过程中,‌可能会遇到各种错误,‌导致无法成功更改或网络连接出现问题。‌‌而更改网络IP地址时出现错误是由于多种原因导致…

Laravel邮件发送功能的实现的方法和技巧?

Laravel邮件发信功能如何配置?怎么使用Laravel发信? 在现代Web开发中,邮件发送功能是不可或缺的一部分。Laravel框架以其优雅的语法和强大的功能,成为了许多开发者的首选。AokSend将深入探讨如何在Laravel中实现邮件发送功能&…

每天学习一个基础算法之二分查找

目录 前言: 1、对二分查找概念的诠释 2、二分查找的使用场景 3、对比顺序查找与二分查找时间复杂度 4、二分查找的实现代码 代码主体(以接口函数的形式) 实现思路: 测试部分(主函数调用) 调试结果 前言&…

并发服务器---IO多路复用

单循环服务器:同一时刻只能处理一个客户端任务 并发服务器: 同一时刻,只能处理多个客户端的任务 实现方法:多进程 多线程 IO多路复用 IO多路复用: 1.阻塞io(fgets scanf recv getchar read&#x…

【软件测试】软件测试生命周期与Bug

目录 📕 前言 🌴软件测试的生命周期 ​编辑🌲BUG 🚩 概念 🚩描述bug的要素 🚩bug的级别 🚩bug的生命周期 🏀先检查自身,是否bug描述不清楚 🏀站在用…