1. 程式人生 > 實用技巧 >c#呼叫python指令碼

c#呼叫python指令碼

最開始根據網上大部分人的經驗,使用ironPython,但問題太多了,最根本的就是他不支援python3以上的,所以後來使用了程序的方式來呼叫python檔案

var result = string.Empty;
var pypath = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), @"E:\main.py");
var p = new ProcessStartInfo();
var sArguments = pypath;
sArguments += " "+param1+" "
+param2;//多個引數用空格隔開 //如果沒有配置環境變數,就使用python執行程式的絕對路徑 p.FileName = @"C:\Users\Bruce\AppData\Local\Programs\Python\Python38-32\python.exe"; //p.FileName=@"python.exe" p.Arguments = sArguments; p.UseShellExecute = false; p.RedirectStandardError = true; p.RedirectStandardOutput = true; p.CreateNoWindow = true;
using (Process process = Process.Start(p)) { using (StreamReader reader = process.StandardOutput) { string stderr = process.StandardError.ReadToEnd(); result = reader.ReadToEnd(); } }

.py檔案程式碼如下

#!/usr/bin/python
#coding=utf-8
import
sys import xlrd import xlwt from xlutils.copy import copy import clr clr.AddReference('System.Data') import pyodbc def process(dbHost, dbUserName, dbPassword, dbName, templateFileLoc, desFileLoc, userID, startTime, endTime): rb = xlrd.open_workbook(templateFileLoc,formatting_info=True) wb = copy(rb) ws = wb.get_sheet(0) connection = pyodbc.connect("DRIVER={SQL Server};SERVER="+dbHost+";DATABASE="+dbName+";UID="+dbUserName+";PWD="+dbPassword+"") cursor = connection.cursor() #get this database vernier sql = "select * from table" cursor.execute(sql) #execute sql statements rows = cursor.fetchall() #return a list object i = 2 for row in rows: ws.write(i, 0, i-1) for j in range(len(row)): if type(row[j])==str: ws.write(i, j+1, row[j]) i=i+1 cursor.close() connection.close() wb.save(desFileLoc) return True #when you define a method,you must call the function process(sys.argv[1], sys.argv[2], sys.argv[3],sys.argv[4],sys.argv[5],sys.argv[6],sys.argv[7],sys.argv[8],sys.argv[9])

最開始是報:no module name ***,這個沒有多說的,pip install安裝好需要的模組就行了,此處安裝clr有個坑,當pip install clr後還是會報錯,提示clr沒有AddReference屬性,因為雖然在程式裡是import clr,但是安裝的時候要使用pip install ptthonnet。而不能使用pip install clr命令,否則就會安裝另外一個名為clr但功能不同的python包

然後就是報:utf-8 codec can’t decode byte 0xbb in position3:invalid start byte,原因是檔案裡有中文,在python直譯器裡有中文沒關係,但呼叫python指令碼的時候,檔案和路徑裡最好不要有中文

接下來是執行完畢,但實際上並未呼叫python函式,所以如果是呼叫腳本里的函式,要麼python先執行這個函式,要麼在程式裡呼叫這個函式