[Python/C#]C#交互Python(看这篇就够了)

[Python/C#]C#交互Python(看这篇就够了)

· IronPython(不支持第三方库)

IronPython 是一种在 NET 和 Mono 上实现的 Python 语言,由 Jim Hugunin(同时也是 Jython 创造者)所创造。1.0 版于2006年9月5日发布。
随后,在 2007 年,开发者决定改写构架,使用动态类型系统以让更多脚本语言能很容易地移植到NET Framework上。2008 年,随着微软发布 NET Framework3.0/3.5、Silverlight 之后,IronPython也发布了 2.0 版,最新版本是 2.7,于 2011年3月发布,支持.NET Framework 4.0。
(来自百度百科)

1.安装

右击"引用",点击"管理 NuGet 程序包"
在这里插入图片描述
搜索IronPython,并点击安装。在这里插入图片描述
这样,IronPython就安装完成了。

2.应用

弄点简单的UI,开始码代码。
在这里插入图片描述
在"你的项目目录\bin\Debug"里添加.py文件。
在这里插入图片描述
编辑py文件:

import time

def get_time():
    now_time = time.time()
    return str(now_time)

编辑C#文件:

private void button1_MouseClick(object sender, MouseEventArgs e)
        {
            // 创建Python解释器对象
            ScriptEngine pyEngine = Python.CreateEngine();
            // 读取脚本文件
            dynamic py = pyEngine.ExecuteFile(@"python.py");
            // 调用Python函数
            string time = py.get_time();
            label1.Text = time;
        }

点击按钮,发现Python函数成功返回。
在这里插入图片描述

总结

IronPython虽然能够交互Python,但支持的库不多,所以爬虫就肯定是不能开发的,但是下面一章,我会教大家C#在Python有第三方库的情况下交互Python。

· Pyinstaller

PyInstaller 是一个程序,将(包)Python 程序打包到独立的可执行文件中,在 Windows、Linux、Mac OS X、FreeBSD、Solaris 和 AIX 下。与类似工具不同,它的主要优点是 PyInstaller 可以与 Python 2.7 和 3.3_3.5 配合使用,它通过透明压缩构建更小的可执行文件,它是完全多平台的,并使用操作系统支持来加载动态库,从而确保完整兼容性。
PyInstaller 的主要目标是与开箱即用的第三方软件包兼容。这意味着,使用 PyInstaller 时,所有使外部包正常工作所需的技巧都已集成到 PyInstaller 本身中,因此无需用户干预。您永远不需要在 wiki 中查找技巧,并将自定义修改应用于文件或设置脚本。例如,像PyQt、Django或matplotlib这样的库完全支持,而无需手动处理插件或外部数据文件。有关详细信息,请查看我们支持包的兼容性列表。
(来自官方介绍)

1.安装

打开cmd,输入以下命令:

pip install pyinstaller

2.打包成exe,你能奈我何?

通过把Python打包成exe,C#再通过cmd进行交互。这样,就可以解决第三方库的问题。
如何打包?
使用方法(例子):

pyinstaller -F python.py

-F:打包成单个文件
-p:指定python安装包路径
-i:指定图标,图标要放在同目录下
python.py:要打包的文件,和图标放在同目录下
在这里插入图片描述
这样,就打包完成了。

3.交互

Python代码:

import sys
import requests
import bs4

def get_url_title(url):
    try:
    	# 得到网页
        html = requests.get(url).text
        # 解析网页
        soup = bs4.BeautifulSoup(html, 'lxml')
        # 获得网页标题
        print(soup.title.text)
    except:
        print('错误!')

if __name__ == '__main__':
	# 获取cmd传递的函数
    url = sys.argv[1]
    get_url_title(url)

C#交互代码

			// 调用python脚本
            Process p = new Process();
            p.StartInfo.FileName = "python.exe";
            p.StartInfo.UseShellExecute = false;
            p.StartInfo.RedirectStandardOutput = true;
            p.StartInfo.RedirectStandardInput = true;
            p.StartInfo.CreateNoWindow = true;
            // 注意,这前面得有一个空格,不然就连在一起了
            p.StartInfo.Arguments = " " + "https://blog.csdn.net/leotao9527/article/details/104878591";
            p.Start();
            string output = p.StandardOutput.ReadToEnd();
            p.WaitForExit();
            p.Close();
            label1.Text = output;

这样就可以了,但还有一个问题:cmd的编码是UTF-16,不支持中文,所以返回的数据一旦有中文,就会乱码。那么,该如何解决呢?

4.解决乱码

其实解决乱码非常简单,只要在C#代码里加上一句就可以了:

// 将控制台的首选编码转为UTF-8
p.StartInfo.StandardOutputEncoding = System.Text.Encoding.UTF8;

这个问题其实也困扰了我许久,希望对大家有帮助。
在这里插入图片描述

结束语

C#可以用两种方法来交互Python,如果你比较了解Python,可以用Python来写爬虫,用C#来写界面,是不是非常方便呢?

把困难举在头上,它就是灭顶石;把困难踩在脚下,它就是垫脚石。

C#中与Python进行交互有几种方式,以下是两种常用的方式: 1. 使用IronPython:IronPython是一个在.NET平台上运行的Python解释器,可以与C#无缝集成。你可以通过NuGet包管理器将IronPython添加到你的C#项目中,并使用它来执行Python代码、调用Python模块和访问Python对象。下面是一个简单的示例: ```csharp using IronPython.Hosting; using IronPython.Runtime; // 创建Python引擎 var engine = Python.CreateEngine(); // 执行Python代码 engine.Execute("print('Hello from Python!')"); // 调用Python函数 dynamic pythonFunction = engine.Execute("def add(a, b):\n return a + b"); dynamic result = pythonFunction.add(3, 4); Console.WriteLine(result); // 输出:7 ``` 2. 使用Python的进程间通信:你可以在C#中启动一个Python进程,并通过标准输入输出进行通信。这个方法可以更灵活地与Python交互,但需要手动处理进程通信。下面是一个简单的示例: ```csharp using System.Diagnostics; // 创建Python进程 var processInfo = new ProcessStartInfo { FileName = "python", Arguments = "sample_script.py", // Python脚本的路径 RedirectStandardInput = true, RedirectStandardOutput = true, UseShellExecute = false, CreateNoWindow = true }; var process = Process.Start(processInfo); // 向Python进程发送输入 process.StandardInput.WriteLine("print('Hello from Python!')"); process.StandardInput.WriteLine("x = 3"); process.StandardInput.WriteLine("y = 4"); process.StandardInput.WriteLine("print(x + y)"); // 从Python进程接收输出 string output = process.StandardOutput.ReadToEnd(); Console.WriteLine(output); // 输出Python的输出 // 等待Python进程结束 process.WaitForExit(); // 关闭进程 process.Close(); ``` 请注意,这只是两种常见的方法之一,还有其他方法可供选择。选择哪种方式取决于你的具体需求和项目的要求。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值