在Linux環境里面,Python調用C#寫的動態庫,如何實現?

在Linux環境中,Python可以通過pythonnet(CLR的Python綁定)或subprocess調用C#動態庫。以下是兩種方法的示例:


方法1:使用pythonnet(推薦)

前提條件
  1. 安裝Mono或.NET Core運行時
  2. 安裝pythonnet包:
    bash
    pip install pythonnet
     
示例步驟
  1. ??C# 動態庫代碼?? (MyLibrary.cs):

csharp

using System;namespace MyLibrary
{public class Calculator{public int Add(int a, int b) => a + b;public static string Greet(string name) => $"Hello, {name}!";}
}
  1. ??編譯C#為動態庫??:

bash

# 使用Mono編譯
mcs -target:library -out:MyLibrary.dll MyLibrary.cs# 或使用.NET Core
dotnet publish --configuration Release --output ./out
  1. ??Python調用代碼??:

python

import os# ===== 關鍵設置:強制使用 .NET Core =====
os.environ["PYTHONNET_RUNTIME"] = "coreclr"  # 必須在 import clr 之前!
os.environ["DOTNET_ROOT"] = "/usr/share/dotnet"  # 確保路徑正確(可通過 `which dotnet` 確認)# ===== 加載 .NET 庫 =====
import clr
clr.AddReference("./MyLibrary.dll")from MyLibrary import Calculator# ===== 調用方法 =====
calc = Calculator()
result = calc.Add(3, 4)  # 調用實例方法
print(f"3 + 4 = {result}")  # 輸出: 3 + 4 = 7message = Calculator.Greet("World")  # 調用靜態方法
print(message)  # 輸出: Hello, World!

方法2:通過subprocess調用(通用方案)

如果pythonnet不可用,可以通過命令行調用C#程序。

  1. ??C# 可執行程序?? (Program.cs):

csharp

using System;class Program
{static void Main(string[] args){if (args.Length > 0 && args[0] == "add"){int a = int.Parse(args[1]);int b = int.Parse(args[2]);Console.WriteLine(a + b);}}
}
  1. ??編譯并運行??:

bash

# 編譯
mcs -out:Program.exe Program.cs# Python調用
import subprocessdef add_numbers(a, b):result = subprocess.run(["mono", "Program.exe", "add", str(a), str(b)],stdout=subprocess.PIPE,text=True)return int(result.stdout)print(add_numbers(5, 3))  # 輸出: 8

關鍵注意事項

  1. ??運行時依賴??:

    • 必須安裝Mono (sudo apt install mono-complete) 或.NET Core
    • pythonnet在Linux上需要libgdiplus(部分系統需手動安裝)
  2. ??路徑問題??:

    • 動態庫路徑需使用絕對路徑或確保Python工作目錄正確
  3. ??跨平臺兼容性??:

    • 若使用.NET Core,編譯時指定運行時標識符(如linux-x64
  4. ??性能考慮??:

    • pythonnet適合高頻調用,subprocess適合低頻簡單調用

故障排查

  • 如果clr.AddReference失敗,嘗試:

    python

    import os
    os.environ["MONO_GAC_PREFIX"] = "/usr"  # 或Mono的實際安裝路徑

  • 確保動態庫架構與Python解釋器匹配(同為x64或x86)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/907922.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/907922.shtml
英文地址,請注明出處:http://en.pswp.cn/news/907922.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

小程序跳轉H5或者其他小程序

1. h5跳轉小程序有兩種情況 &#xff08;1&#xff09;從普通瀏覽器打開的h5頁面跳轉小程序使用wx-open-launch-weapp可以實現h5跳轉小程序 <wx-open-launch-weappstyle"display:block;"v-elseid"launch-btn":username"wechatYsAppid":path…

性能優化 - 案例篇:緩沖區

文章目錄 Pre1. 引言2. 緩沖概念與類比3. Java I/O 中的緩沖實現3.1 FileReader vs BufferedReader&#xff1a;裝飾者模式設計3.2 BufferedInputStream 源碼剖析3.2.1 緩沖區大小的權衡與默認值 4. 異步日志中的緩沖&#xff1a;Logback 異步日志原理與配置要點4.1 Logback 異…

文檔整合自動化

主要功能是按照JSON文件&#xff08;Sort.json&#xff09;中指定的順序合并多個Word文檔&#xff08;.docx&#xff09;&#xff0c;并清除文檔中的所有超鏈接。最終輸出合并后的文檔名為"sorted_按章節順序.docx"。 主要分為幾個部分&#xff1a; 初始化配置 定…

嵌入式(C語言篇)Day13

嵌入式Day13 一段話總結 文檔主要介紹帶有頭指針和尾指針的單鏈表的實現及操作&#xff0c;涵蓋創建、銷毀、頭插、尾插、按索引/數據增刪查、遍歷等核心操作&#xff0c;強調頭插/尾插時間復雜度為O(1)&#xff0c;按索引/數據操作需遍歷鏈表、時間復雜度為O(n)&#xff0c;并…

【ASR】基于分塊非自回歸模型的流式端到端語音識別

論文地址:https://arxiv.org/abs/2107.09428 摘要 非自回歸 (NAR) 模型在語音處理中越來越受到關注。 憑借最新的基于注意力的自動語音識別 (ASR) 結構,與自回歸 (AR) 模型相比,NAR 可以在僅精度略有下降的情況下實現有前景的實時因子 (RTF) 提升。 然而,識別推理需要等待…

RNN循環網絡:給AI裝上“記憶“(superior哥AI系列第5期)

&#x1f504; RNN循環網絡&#xff1a;給AI裝上"記憶"&#xff08;superior哥AI系列第5期&#xff09; 嘿&#xff01;小伙伴們&#xff0c;又見面啦&#xff01;&#x1f44b; 上期我們學會了讓AI"看懂"圖片&#xff0c;今天要給AI裝上一個更酷的技能——…

DAY41 CNN

可以看到即使在深度神經網絡情況下&#xff0c;準確率仍舊較差&#xff0c;這是因為特征沒有被有效提取----真正重要的是特征的提取和加工過程。MLP把所有的像素全部展平了&#xff08;這是全局的信息&#xff09;&#xff0c;無法布置到局部的信息&#xff0c;所以引入了卷積神…

【仿生系統】愛麗絲機器人的設想(可行性優先級較高)

非程序化、能夠根據環境和交互動態產生情感和思想&#xff0c;并以微妙、高級的方式表達出來的能力 我們不想要一個“假”的智能&#xff0c;一個僅僅通過if-else邏輯或者簡單prompt來模擬情感的機器人。您追求的是一種更深層次的、能夠學習、成長&#xff0c;并形成獨特“個性…

面向連接的運輸:TCP

目錄 TCP連接 TCP報文段結構 往返時間估計與超時 可靠數據傳輸 回退N步or超時重傳 超時間隔加倍 快速重傳 流量控制 TCP連接管理 三次握手 1. 客戶端 → 服務器&#xff1a;SYN 包 2. 服務器 → 客戶端&#xff1a;SYNACK 包 3. 客戶端 → 服務器&#xff1a;AC…

SpringAI系列 - 升級1.0.0

目錄 一、調整pom二、MessageChatMemoryAdvisor調整三、ChatMemory get方法刪除lastN參數四、QuestionAnswerAdvisor調整Spring AI發布1.0.0正式版了?? ,搞起… 一、調整pom <properties><java.version>17</java.version><spring-ai.version>

前端高頻面試題2:JavaScript/TypeScript

1.什么是類數組對象 一個擁有 length 屬性和若干索引屬性的對象就可以被稱為類數組對象&#xff0c;類數組對象和數組類似&#xff0c;但是不能調用數組的方法。常見的類數組對象有 arguments 和 DOM 方法的返回結果&#xff0c;還有一個函數也可以被看作是類數組對象&#xff…

Spring Security入門:創建第一個安全REST端點項目

項目初始化與基礎配置 創建基礎Spring Boot項目 我們首先創建一個名為ssia-ch2-ex1的空項目(該名稱與配套源碼中的示例項目保持一致)。項目需要添加以下兩個核心依賴: org.springframework.bootspring-boot-starter-weborg.springframework.bootspring-boot-starter-secur…

秋招Day12 - 計算機網絡 - UDP

說說TCP和UDP的區別&#xff1f; TCP使用無邊界的字節流傳輸&#xff0c;可能發生拆包和粘包&#xff0c;接收方并不知道數據邊界&#xff1b;UDP采用數據報傳輸&#xff0c;數據報之間相互獨立&#xff0c;有邊界。 應用場景方面&#xff0c;TCP適合對數據的可靠性要求高于速…

【QQ音樂】sign簽名| data參數加密 | AES-GCM加密 | webpack (下)

1.目標 網址&#xff1a;https://y.qq.com/n/ryqq/toplist/26 我們知道了 sign P(n.data)&#xff0c;其中n.data是明文的請求參數 2.webpack生成data加密參數 那么 L(n.data)就是密文的請求參數。返回一個Promise {<pending>}&#xff0c;所以L(n.data) 是一個異步函數…

Codeforces Round 1028 (Div. 2)(A-D)

題面鏈接&#xff1a;Dashboard - Codeforces Round 1028 (Div. 2) - Codeforces A. Gellyfish and Tricolor Pansy 思路 要知道騎士如果沒了那么這個人就失去了攻擊手段&#xff0c;貪心的來說我們只需要攻擊血量少的即可&#xff0c;那么取min比較一下即可 代碼 void so…

【存儲基礎】存儲設備和服務器的關系和區別

文章目錄 1. 存儲設備和服務器的區別2. 客戶端訪問數據路徑場景1&#xff1a;經過服務器處理場景2&#xff1a;客戶端直連 3. 服務器作為"中轉站"的作用 剛開始接觸存儲的時候&#xff0c;以為數據都是存放在服務器上的&#xff0c;服務器和存儲設備是一個東西&#…

macOS 安裝 Grafana + Prometheus + Node Exporter

macOS 安裝指南&#xff1a;Grafana Prometheus Node Exporter 目錄簡介&#x1f680; 快速開始 安裝 Homebrew1. 安裝 Homebrew2. 更新 Homebrew 安裝 Node Exporter使用 Homebrew 安裝驗證 Node Exporter 安裝 Prometheus使用 Homebrew 安裝驗證安裝 安裝 Grafana使用 Home…

不可變集合類型轉換異常

記錄一個異常&#xff1a;class java.util.ImmutableCollections$ListN cannot be cast to class java.util.ArrayList (java.util.ImmutableCollections$ListN and java.util.ArrayList 文章目錄 1、原因2、解決方式一3、解決方式二4、關于不可變集合的補充4.1 JDK8和9的對比4…

【DAY37】早停策略和模型權重的保存

內容來自浙大疏錦行python打卡訓練營 浙大疏錦行 知識點&#xff1a; 過擬合的判斷&#xff1a;測試集和訓練集同步打印指標模型的保存和加載 僅保存權重保存權重和模型保存全部信息checkpoint&#xff0c;還包含訓練狀態 早停策略 作業&#xff1a; 對信貸數據集訓練后保存權…

【Zephyr 系列 3】多線程與調度機制:讓你的 MCU 同時干多件事

好的,下面是Zephyr 系列第 3 篇:聚焦 多線程與調度機制的實踐應用,繼續面向你這樣的 Ubuntu + 真板實戰開發者,代碼清晰、講解通俗、結構規范,符合 CSDN 高質量博客標準。 ??關鍵詞:Zephyr、線程調度、k_thread、k_sleep、RTOS、BluePill ??適合人群:想從裸機開發進…