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"))
相关推荐
じ☆冷颜〃3 小时前
分布式系统中网络技术的演进与异构融合架构(HFNA)
笔记·python·物联网·设计模式·架构·云计算
夜思红尘5 小时前
算法--双指针
python·算法·剪枝
人工智能训练5 小时前
OpenEnler等Linux系统中安装git工具的方法
linux·运维·服务器·git·vscode·python·ubuntu
散峰而望5 小时前
【算法竞赛】C++函数详解:从定义、调用到高级用法
c语言·开发语言·数据结构·c++·算法·github
冷凝雨6 小时前
复数乘法(C & Simulink)
c语言·开发语言·信号处理·simulink·dsp
智航GIS6 小时前
8.2 面向对象
开发语言·python
蹦蹦跳跳真可爱5897 小时前
Python----大模型(GPT-2模型训练加速,训练策略)
人工智能·pytorch·python·gpt·embedding
xwill*7 小时前
π∗0.6: a VLA That Learns From Experience
人工智能·pytorch·python
智者知已应修善业7 小时前
【求等差数列个数/无序获取最大最小次大次小】2024-3-8
c语言·c++·经验分享·笔记·算法
还不秃顶的计科生7 小时前
LeetCode 热题 100第二题:字母易位词分组python版本
linux·python·leetcode