关于C#调用python生成的exe文件一些相关事项
最近用C#做了一个小系统,基于B/S开发,其中有个小功能需要用到车牌识别。本人水平有限,在网上找到了一个车牌识别的列子,是用python开发的。于是我用pyinstaller将py文件打包成exe文件,用C#直接调用,传递参数并获取返回值。
首先是C#部分,直接上代码(写在webform中的page_load事件里,方便测试):
Process p = new Process();
p.StartInfo.FileName = Server.MapPath("~") + "testpath/dist/testpath/testpath.exe";//需要执行的文件,我把他放在了网站目录下
p.StartInfo.UseShellExecute = false; //必需
p.StartInfo.RedirectStandardOutput = true;//输出参数设定
p.StartInfo.RedirectStandardInput = true;//传入参数设定
p.StartInfo.CreateNoWindow = true;
p.StartInfo.Arguments = @"D:\RecognitionCarNum\img\5.jpg";//参数以空格分隔,如果某个参数为空,可以传入””
p.Start();
string output = p.StandardOutput.ReadToEnd();
p.WaitForExit();//关键,等待外部程序退出后才能往下执行}
Response.Write(output);//输出
p.Close();
下面是python部分,我只是简单的执行python打包的exe文件:
import os
import sys
#有参数的函数
def show(img_path):
f = open("D:/pathdata") #这里需要用到绝对路径,下面会详细解释
return f.read()+img_path
if __name__ == '__main__':
print(os.getcwd())
print(show(sys.argv[1])) #表示传递进来的参数,sys.argv[0]表示文件本身名字,从1开始,依次类推
单独运行exe文件时,需要把pathdata文件放在exe文件所在的目录下。然后我依样画葫芦,将整个exe文件夹拷贝到C#网站项目目录下,执行的时候发现找不到pathdata文件(此时我的路径还未改成绝对路径)。重点在路径这里:exe文件在IIS上运行时,exe程序内查找的当前路径其实并不是exe程序文件所在的路径。有点拗口,下面详细地说明:
比如我的exe程序文件在D:/dist文件夹下,如果我本地电脑上运行,那么将会查找dist文件夹下的内容。但是现在我是在IIS上调用exe文件,可以理解为,exe文件查找的文件路径应该是IIS所在的路径。因为我也不清楚具体的IIS路径在哪里,所以选择使用绝对路径。所以我将pathdata等一些需要外部查找的配置及其他文件放在D盘下。
经过测试,发现OK,可以传递参数,也可以取得返回值。具体截图如下:
转载自:https://blog.csdn.net/cataclysm2012/article/details/80063716