[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#来写界面,是不是非常方便呢?
把困难举在头上,它就是灭顶石;把困难踩在脚下,它就是垫脚石。