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"))
相关推荐
xxwl5853 小时前
数据结构知识点和代码实现总结(C语言实现)
c语言·开发语言·数据结构
北冥有鱼被烹5 小时前
砷化镓与磷化铟:光模块的地基——从化学键到AI缺货潮的底层逻辑
人工智能·python
小灰灰搞电子5 小时前
C语言 <time.h> 头文件详解
c语言·time.h
for_ever_love__6 小时前
线性回归与梯度下降——从零手写一个模型
python·机器学习·线性回归·梯度下降
C++ 老炮儿的技术栈6 小时前
sizeof操作符
c语言·c++·人工智能·mfc·c
code_whiter6 小时前
7.自动化测试常用函数
python·功能测试
小园子的小菜6 小时前
Python协程深度解析:从原理演进到实战避坑
后端·python
砚底藏山河6 小时前
量化实战:截面因子有效性检验(IC 分析与分层回测)
java·python·金融·maven
wuminyu6 小时前
ForkJoinPool内部WorkQueue的Lock-Free数组操作以及并发任务窃取原理剖析
java·linux·c语言·jvm·c++
她说彩礼65万7 小时前
C语言 堆区和栈区
java·linux·c语言