python脚本语言对于运维来说是非常方便的,特别是第三方库,但是我的桌面应用是c#写的,所以我要考虑怎么去让c#能去调用,赋值和传参python,有两种方法,但是都有利弊,希望有更好方法的小伙伴能分享一下。
第一个方法,在vs的NuGet包里,有一个IronPython包,IronPython 是一种在 NET 和 Mono 上实现的 Python 语言,使用动态类型系统以让更多脚本语言能很容易地移植到NET Framework上。如果不使用第三方库,这个软件相当完美,但是使用第三方库的时候就各种问题来了,第一,不能使用pip安装,pip安装没有.egg文件,必须引用.egg的文件才能使用。第二,安装过程的繁琐性,反正我试了一下,就不想在体验第二遍了。百度搜索的基本上都是这个方法的介绍。
第二个方法,用python编译好文件,*.py,在c#中用流的方式打开,修改,然后保存,在模拟dos环境下运行,获取返回值。传参和返回都能实现,但是弊端就是还要在电脑上装python和第三方库。下面我们来看下这种方法的实现。
首先定义一个方法。通过cmd去运行python程序,并且获取它的返回值。
private void Result(string mingling)
{
Process CmdProcess = new Process();
CmdProcess.StartInfo.FileName = "cmd.exe";
CmdProcess.StartInfo.CreateNoWindow = true; // 不创建新窗口
CmdProcess.StartInfo.UseShellExecute = false; //不启用shell启动进程
CmdProcess.StartInfo.RedirectStandardInput = true; // 重定向输入
CmdProcess.StartInfo.RedirectStandardOutput = true; // 重定向标准输出
CmdProcess.StartInfo.RedirectStandardError = true; // 重定向错误输出
CmdProcess.StartInfo.Arguments = "/c " + mingling;//“/C”表示执行完命令后马上退出
CmdProcess.Start();//执行
StreamReader reader = CmdProcess.StandardOutput;
while (!reader.EndOfStream)
{
listBox1.Items.Add(reader.ReadLine());
}
}
运行里面程序,并对里面进行修改。
private void button1_Click(object sender, EventArgs e)
{
listBox1.Items.Clear();
string[] lines = File.ReadAllLines(@"command.py");//打开相对路径的python程序
//修改第五列,第六列的数据,当然也可以是一个空的*.py,全部命令都修改进去,我这里举个例子
lines[4] = "client.connect("" + textBox1.Text + "", username="" + textBox2.Text + "", password="" + textBox3.Text + "")";//从textbox里面获取账号密码进行登录
lines[5] = "stdin, stdout, stderr = client.exec_command('tftp " + textBox4.Text + " put startup.cfg " + textBox1.Text + ".txt')";//修改参数,tftp保存交换机配置命令
File.WriteAllLines(@"command.py", lines, Encoding.UTF8);
Result(@"command.py");
}
我这是一个交换机配置备份的一个功能,IP,用户名,密码写进去,交换机实现配置保存,返回结果显示在listbox上面,IP,用户名,密码可以从控件里面得到,也可以自己写在一个txt里面读取也可以,固定下来,写个循环,每天点一下就可以导出,后面扩展还可以实现配置对比。
这两种方法都可以实现对python脚本传参和返回信息。python的第三方库确实有很多用起来很方便,如果在一门语言编写某个功能有点吃力的时候,可以考虑一下,用别的语言去实现,再去调用。
最后来一张过年过节的心情图。
领取专属 10元无门槛券
私享最新 技术干货