C 控制台程式呼叫python

2021-08-28 10:53:24 字數 4138 閱讀 6966

之前學習python,研究了一下使用c#呼叫python,現在把過程發出來給大家參考。

參考:我的開發環境是vs2017+python 2.7.15+ironpython-2.7.7(使用python3以上的版本貌似不行)

python實現協同過濾就不詳細介紹了,主要說一下除錯中碰到的問題

1、ironpython.runtime.exceptions.importexception:「no module named requests」

2、ironpython.runtime.exceptions.importexception:「cannot import name _remove_dead_weakref」

3、system.missingmemberexception:「'module' object has no attribute '_getframe'」

下面奉上原始碼:

python

#!/usr/bin/python2

# -*- coding: utf-8 -*-

#已實現python結合c#實現協同過濾推薦演算法

import sys

import requests

import json

#self.diffs 矩陣儲存評分矩陣,

#self.freqs 儲存一對 items 被相同使用者評分的數量。

diffs = {}

freqs = {}

# 根據提供的資料,構建self.diffs / self.freqs字典

def update(data):

# 遍歷每個使用者的每個評分資料

for user, prefs in data.items():

# 確保子字典存在

for item, rating in prefs.items():

freqs.setdefault(item, {})

diffs.setdefault(item, {})

# setdefault 作用:

#如果對於給定的鍵值/setdefault的第乙個引數,

#字典中為對應value為空,

#則將setdefault的第二個引數賦值給它。

# 下面再次迴圈遍歷user對應的prefs中的每一組評分

for item2, rating2 in prefs.items():

freqs[item].setdefault(item2, 0)

diffs[item].setdefault(item2, 0.0)

# 使用整數0初始化次數,浮點型零初始化評分。

# 利用兩個item是否同時被乙個使用者評分,

#對self.freqs進行更新

freqs[item][item2] += 1

# 利用兩個item的評分之差,對self.diffs矩陣進行更新

diffs[item][item2] += rating - rating2

# 將兩個item在diffs 矩陣與 freqs矩陣對應位置相除,

#結果儲存到freqs中,即為兩個item的平均差距

for item, ratings in diffs.items():

for item2, rating in ratings.items():

ratings[item2] /= freqs[item][item2]

return "準備完成"

# 對新的使用者偏好,根據 self.diffs / self.freqs 對新使用者進行評分**

def predict(userprefs):

# 定義兩個空字典,preds儲存**資料,freqs儲存計數

preds, freqss = {}, {}

# 迭代每乙個物品(被使用者評分過的)

# 使用try/except跳過沒有被評分的物品對

for item, rating in userprefs.items():

for diffitem, diffratings in diffs.items():

try:

freq = freqs[diffitem][item]

except keyerror:

continue

# 設定preds初始值為0.0, freqs初始值為0

preds.setdefault(diffitem, 0.0)

freqss.setdefault(diffitem, 0)

# 累加

preds[diffitem] += freq * (diffratings[item] + rating)

freqss[diffitem] += freq

# 在返回結果之前,進行過濾

# 返回乙個 帶權重**值 的新字典

# 結果中除去了 使用者已經評分過的內容 和 物品計數為零的內容

return dict([(item, value / freqss[item]) for item, value in preds.items() if item not in userprefs and freqss[item] > 0])

#return dict(alice=dict(a=5.0, b=4.0,c=3.0),bob=dict(a=4.0 ,b = 5.0,c=3.0,d=5),lili=dict(a=4,b=4,d=5))

#return dict([(item, value / freqss[item]) for item, value in preds.items() if item not in userprefs ])

def collaborative_filtering():

try:

print '呼叫介面獲取json資料'

'''print('get請求獲取的響應結果json型別',r.text)

print('get請求獲取的響應結果json型別',r.text)

print("get請求獲取響應頭",r.headers['content-type'])

'''#響應的json資料轉換為可被python識別的資料型別

predict_dic={}

input_dict={}

json_r = r.json()

if(json_r["result"]==0 and len(json_r["data"])>0):

list=json.loads(json_r["data"])

predict_dic=list[str(uid)]

list.pop(str(uid))

update(list)

prediction=predict(predict_dic)

for item,rating in prediction.items():

print item+":\t"+str(rating)

print '完成'

return prediction

#print(json_r)

except exception as e:

print str(e)

return dict(msg=str(e))

c#

var options = new dictionary();

options["frames"] = true;

options["fullframes"] = true;

scriptengine pyengine = python.createengine(options);//建立python直譯器物件

dynamic py = pyengine.executefile(@"d:\\python\\call.py");//讀取指令碼檔案

ironpython.runtime.pythondictionary prediction = py.collaborative_filtering();

控制台程式裡呼叫控制台程式

現在遇到這麼個問題,我想用控制台裡呼叫控制台程式來實現多文字。但是在控制台裡呼叫控制台程式時,它不是出現新的控制台視窗顯示,而是已有的控制台裡顯示呼叫的程式,system d code 練習 jjplace editor debug editor.exe winexec d code 練習 jjpl...

C 中呼叫控制台程式時隱藏控制台視窗

有時我們在呼叫控制台程式時,不希望看到控制台視窗,在c 中可以通過以下方法實現 processstartinfo startinfo new processstartinfo e helloworld.exe startinfo.createnowindow true 不建立視窗 startinfo...

在C 中呼叫控制台程式

需求 想在c 中呼叫乙個帶有引數 dos命令 whoami,並處理返回的文字資訊 調查 一檢視 發現是個 exe 的問件,並且這個.exe可以根據不同的引數,得到不同的系統資訊 關鍵 新建了個窗體程式,在載入窗體的時候執行,只是個小demo,就不多說了 private void form1 load...