吾生有涯 学海无涯
析模有界 知识无界

pyANSYS|C#调用python程序

内容纲要

最近在用pyANSYS进行二次开发。之前使用PySide6做GUI界面,后面怎么看都觉得QT的原生界面实在是太丑了,专门做界面美化不熟悉而且又没那么多时间,考虑到程序只运行在Windows系统上,然后就换成C#配合DevExpress做界面了。漂亮的界面是搞出来了,但pyANSYS是基于python的,如何在C#下调用python编程的pyANSYS就成了个麻烦的问题。

网上搜索了一波,发现方法还不少,留此备查。

注:以下内容来自于互联网。

1 进程调用

将python程序打包成exe程序。常用的python打包工具有pyinstaller、Nuitka等,然后利用进程调用的方式启动exe程序。

这种方式最大的优点是将python环境一起打包到exe程序中,无需在目标机器上安装python依赖,这对于python程序中大量使用了第三方库的程序来说比较方便。

但此方式的缺点也很明显,首先打包后的exe程序非常大,启动的时候非常消耗内存,程序性能不好。

核心代码(原文地址:https://blog.csdn.net/qq_42063091/article/details/82418630):

using System.Diagnostics;

namespace WpfTest2
{
///
/// MainWindow.xaml 的交互逻辑
///

public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}

private void Button_Click(object sender, RoutedEventArgs e)
{
// exe程序的路径
string pyexePath = @"main.exe";

Process p = new Process();
p.StartInfo.FileName = pyexePath;//需要执行的文件路径
p.StartInfo.UseShellExecute = false; //必需
p.StartInfo.RedirectStandardOutput = true;//输出参数设定
p.StartInfo.RedirectStandardInput = true;//传入参数设定
p.StartInfo.CreateNoWindow = true;
p.StartInfo.Arguments = "2 3";//参数以空格分隔,如果某个参数为空,可以传入””
p.Start();
string output = p.StandardOutput.ReadToEnd();
p.WaitForExit();//关键,等待外部程序退出后才能往下执行
Console.Write(output);//输出
p.Close();
}
}
}

2 调用py文件

可以在c#中调用python.exe进程运行py文件。此方法需要在目标机器上安装python以及程序中所使用到的所有python库。

最大的优势是执行效率比调用exe要高一些,缺点是需要安装配置python环境。

核心代码:

private void Button_Click(object sender, RoutedEventArgs e)
{
string[] strArr = new string[2];//参数列表
string sArguments = @"main.py";//这里是python的文件名字
strArr[0] = "2";
strArr[1] = "3";
RunPythonScript(sArguments, "-u", strArr);
}
//调用python核心代码
public static void RunPythonScript(string sArgName, string args = "", params string[] teps)
{
Process p = new Process();
// 获得python文件的绝对路径(将文件放在c#的debug文件夹中可以这样操作)
string path = @"C:UsersuserDesktoptest" + sArgName;
//没有配环境变量的话,可以写python.exe的绝对路径。如果配了,直接写"python.exe"即可
p.StartInfo.FileName = @"D:Pythonenvspython3python.exe";
string sArguments = path;
foreach (string sigstr in teps)
{
sArguments += " " + sigstr;//传递参数
}

sArguments += " " + args;
p.StartInfo.Arguments = sArguments;
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.CreateNoWindow = true;

p.Start();
p.BeginOutputReadLine();
p.OutputDataReceived += new DataReceivedEventHandler(p_OutputDataReceived);
Console.ReadLine();
p.WaitForExit();
}
//输出打印的信息
static void p_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
if (!string.IsNullOrEmpty(e.Data))
{
AppendText(e.Data + Environment.NewLine);
}
}
public delegate void AppendTextCallback(string text);
public static void AppendText(string text)
{
//此处在控制台输出.py文件print的结果
Console.WriteLine(text);
}

测试的python代码:

import numpy as np
import sys

def multiplication(a,b):
return a*b

def func(a,b):
result=np.sqrt(multiplication(int(a),int(b)))
return result

if __name__ == '__main__':
print(func(sys.argv[1],sys.argv[2]))

3 使用ironPython

没有使用过,据说可以在C#中直接调用python,但这种方法对numpy之类的第三方库支持很差。pyansys使用了大量的科学计算库,想想还是算了。

4 使用动态链接库

有说可以利用c/c++程序调用python文件,然后将其做成动态链接库,在c#中调用此dll。想想都觉得麻烦,算了。

5 利用c#的第三方库

这里有篇文章:https://juejin.cn/post/7205449056071123005

里面介绍使用pythonnet库来实现c#对python程序的调用。看介绍效果还不错,不过感觉太麻烦,以后有时间再尝试。


(完)

本篇文章来源于微信公众号: CFD之道

赞(0) 打赏
版权声明:未经允许,请勿随意用于商业用途。
文章名称:《pyANSYS|C#调用python程序》
文章链接:https://www.topcfd.cn/34976/
本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。
分享到

说两句 抢沙发

评论前必须登录!

 

觉得文章有用就打赏一下文章作者吧

非常感谢你的打赏,我们将继续给力更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫

微信扫一扫

登录

找回密码

注册