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"))
相关推荐
dhdjjsjs2 小时前
Day32 PythonStudy
python
漏洞文库-Web安全2 小时前
AWD比赛随笔
开发语言·python·安全·web安全·网络安全·ctf·awd
哈哈xcpc-43992 小时前
天梯赛题解(Python和C++解法)
开发语言·c++·python
smile_Iris3 小时前
Day 34 模块和库的导入
python
北极糊的狐3 小时前
报错java: 找不到符号符号: 类 XxxController位置: 程序包 com.ruoyi.xxx.xxx.service
开发语言·windows·python
0思必得03 小时前
[Web自动化] HTML列表标签
运维·python·自动化·html·web自动化
weixin_429690723 小时前
数字人源码部署供应商
人工智能·python
电饭叔3 小时前
一个构建指定坐标轴在默认点(0,0)的构造方法《python语言程序设计》2018版--第8章17题第2部分
开发语言·笔记·python
qq_251533593 小时前
Python 查找元组中列表的数量
开发语言·python