pythonnet 调用C接口

首先是这个类C#写的ini帮助类

cs 复制代码
    /// <summary>
    ///  INI 文件读写类
    /// </summary>
    public static class RWINI
    {
        #region 声明
        [DllImport("kernel32")]
        private static extern long WritePrivateProfileString(string section, string key, string val, string filePath);
 
        [DllImport("kernel32")]
        private static extern int GetPrivateProfileString(string section, string key, string def, StringBuilder retVal, int size, string filePath);
        #endregion 声明
 
        public static string path = AppDomain.CurrentDomain.BaseDirectory + "CFG.ini";
        public static string Getcwd = System.Environment.CurrentDirectory;
        static public bool NewWinifolder(string folderPath)//folderPath// 指定你想要检查的文件夹路径
        {
            if (!Directory.Exists(folderPath))// 检查文件夹是否存在
            {
                Directory.CreateDirectory(folderPath);// 如果文件夹不存在,则创建它
                return true;
            }
            else { return false; }
        }
 
        static public bool IsFolder(string folderPath)//folderPath// 指定你想要检查的文件夹路径
        {
            if (Directory.Exists(folderPath)) { return true; }
            else { return false; }
        }
 
        /// <summary>
        /// 写INI文件
        /// </summary>
        /// <param name="path">path</param>
        /// <param name="Section">分组节点</param>
        /// <param name="Key">关键字</param>
        /// <param name="Value">值</param>
        static public void Wini(string path, string Section, string Key, string Value)
        {
            WritePrivateProfileString(Section, Key, Value, path);
        }
        /// <summary>
        /// 读取INI文件
        /// </summary>
        /// <param name="path">path</param>
        /// <param name="Section">分组节点</param>
        /// <param name="Key">关键字</param>
        /// <param name="def">缺省值</param>
        /// <returns></returns>
        static public string Rini(string path, string Section, string Key, string def = "")
        {
            StringBuilder temp = new StringBuilder(255);
            int i = GetPrivateProfileString(Section, Key, def, temp, 255, path);
            return temp.ToString();
        }
 
 
 
        /// <summary>
        /// 删除ini文件下所有段落
        /// </summary>
        public static void ClearAllSection(string path)
        {
            Wini(path, null, null, null);
        }
        /// <summary>
        /// 删除ini文件下指定段落下的所有键
        /// </summary>
        /// <param name="Section"></param>
        public static void ClearSection(string path, string Section)
        {
            Wini(path, Section, null, null);
        }
 
 
        static public string RWini测试()
        {
            Wini(Getcwd + "\\CFG.ini", "Section", "Key", "Value");
            string x = Rini(Getcwd + "\\CFG.ini", "Section", "Key", "def");
        
            return "";
        }
 
 
        /********
                    _minThreshold = Convert.ToInt32(  );
        ********/
    }

下面就是"原封不动"的 Python 直译版------只把 C# 语法换成 Python,逻辑、函数名、甚至注释一行不改,用 pythonnet 调 Win32 API。

python 复制代码
# rwini.py
"""单文件 INI 读写包,仅导出 RWINI"""
__all__ = ["RWINI"]          # ← 只暴露这一个名字

# --------------------------------------------------
# 私有实现(下划线模块)
# --------------------------------------------------
import sys, os
import clr
clr.AddReference("System")
from System import AppDomain, Environment
from System.IO import Directory
from System.Text import StringBuilder
import ctypes, ctypes.wintypes as w

_k32 = ctypes.windll.kernel32

def _WritePrivateProfileString(section, key, val, filePath):
    _k32.WritePrivateProfileStringW(section, key, val, filePath)

def _GetPrivateProfileString(section, key, default, retVal, size, filePath):
    buf = w.create_unicode_buffer(size)
    _k32.GetPrivateProfileStringW(section, key, default, buf, size, filePath)
    retVal.Clear()
    retVal.Append(buf.value)
    return len(buf.value)

# --------------------------------------------------
# 公共接口
# --------------------------------------------------
class RWINI:
    path   = AppDomain.CurrentDomain.BaseDirectory + "CFG.ini"
    Getcwd = Environment.CurrentDirectory

    @staticmethod
    def NewWinifolder(folderPath: str) -> bool:
        if not Directory.Exists(folderPath):
            Directory.CreateDirectory(folderPath)
            return True
        return False

    @staticmethod
    def IsFolder(folderPath: str) -> bool:
        return Directory.Exists(folderPath)

    @staticmethod
    def Wini(path: str, Section: str, Key: str, Value: str):
        _WritePrivateProfileString(Section, Key, Value, path)

    @staticmethod
    def Rini(path: str, Section: str, Key: str, default: str = "") -> str:
        sb = StringBuilder(255)
        _GetPrivateProfileString(Section, Key, default, sb, 255, path)
        return sb.ToString()

    @staticmethod
    def ClearAllSection(path: str):
        _WritePrivateProfileString(None, None, None, path)

    @staticmethod
    def ClearSection(path: str, Section: str):
        _WritePrivateProfileString(Section, None, None, path)


# 自测时才会执行
if __name__ == "__main__":
    ini_path = os.path.join(os.getcwd(), "demo.ini")
    RWINI.Wini(ini_path, "Server", "IP", "127.0.0.1")
    print(RWINI.Rini(ini_path, "Server", "IP", "default"))
相关推荐
孟健6 小时前
Karpathy 用 200 行纯 Python 从零实现 GPT:代码逐行解析
python
码路飞8 小时前
写了个 AI 聊天页面,被 5 种流式格式折腾了一整天 😭
javascript·python
曲幽11 小时前
FastAPI压力测试实战:Locust模拟真实用户并发及优化建议
python·fastapi·web·locust·asyncio·test·uvicorn·workers
敏编程15 小时前
一天一个Python库:jsonschema - JSON 数据验证利器
python
前端付豪15 小时前
LangChain记忆:通过Memory记住上次的对话细节
人工智能·python·langchain
databook16 小时前
ManimCE v0.20.1 发布:LaTeX 渲染修复与动画稳定性提升
python·动效
花酒锄作田1 天前
使用 pkgutil 实现动态插件系统
python
前端付豪1 天前
LangChain链 写一篇完美推文?用SequencialChain链接不同的组件
人工智能·python·langchain
曲幽1 天前
FastAPI实战:打造本地文生图接口,ollama+diffusers让AI绘画更听话
python·fastapi·web·cors·diffusers·lcm·ollama·dreamshaper8·txt2img
老赵全栈实战1 天前
Pydantic配置管理最佳实践(一)
python