Python中xxxxxxxxxxxx的作用和原理

本文详细解释了Python中if __name__ == '__main__':语句的作用与原理,此语句用于区分模块是直接执行还是被导入执行,确保特定代码仅在直接运行时执行。
该文章已生成可运行项目,

Python中if name == ‘main’:的作用和原理

转自:Python中if name == ‘main’:的作用和原理

一个python文件通常有两种使用方法,第一是作为脚本直接执行,第二是 import 到其他的 python 脚本中被调用(模块重用)执行。因此 if name == ‘main’: 的作用就是控制这两种情况执行代码的过程,在 if name == ‘main’: 下的代码只有在第一种情况下(即文件作为脚本直接执行)才会被执行,而 import 到其他脚本中是不会被执行的。举例说明如下:

  • 直接执行
    在这里插入图片描述
    直接执行 test.py,结果如下图,可以成功 print 两行字符串。即,if name==“main”: 语句之前和之后的代码都被执行。
    在这里插入图片描述
  • import 执行
    然后在同一文件夹新建名称为 import_test.py 的脚本,输入如下代码:
    在这里插入图片描述
    执行 import_test.py 脚本,输出结果如下:
    在这里插入图片描述
    只输出了第一行字符串。即,if name==“main”: 之前的语句被执行,之后的没有被执行。

if name == ‘main’:的运行原理

每个python模块(python文件,也就是此处的 test.py 和 import_test.py)都包含内置的变量 name,当该模块被直接执行的时候,name 等于文件名(包含后缀 .py );如果该模块 import 到其他模块中,则该模块的 name 等于模块名称(不包含后缀.py)。

而 “main” 始终指当前执行模块的名称(包含后缀.py)。进而当模块被直接执行时,name == ‘main’ 结果为真。

为了进一步说明,我们在 test.py 脚本的 if name==“main”: 之前加入 print(name),即将 name 打印出来。文件内容和结果如下:
在这里插入图片描述在这里插入图片描述
可以看出,此时变量__name__的值为"main"。
再执行 import_test.py,执行结果如下:
在这里插入图片描述在这里插入图片描述

此时,test.py中的__name__变量值为 test,不满足 name==“main” 的条件,因此,无法执行其后的代码。

本文章已经生成可运行项目
<think>嗯,用户现在想了解Python易语言在调用C#DLL时的差异,特别是为什么Python不需要COM注册而易语言需要。用户引用了两段关于DLL依赖路径问题的内容,可能是在之前讨论中提到的注意事项。首先需要明确两者的技术架构区别。Python可以通过pythonnet(CLR)直接加载.NET运行时环境,本质上是作为宿主承载CLR,因此能动态解析并执行托管代码,无需中间转换层。而易语言是纯粹的Win32非托管环境,只能识别COM接口或标准C风格导出函数。关于COM注册环节的关键点:COM本质是微软的跨语言二进制接口规范,要求严格的类型描述(通过注册表写入GUID接口信息)。Python的调用路径绕过了这个规范层,直接进入CLR内部机制;而易语言必须依赖COM的注册信息来定位并验证接口有效性。用户提到的引用资料其实暗示了环境配置的重要性——无论是Python的路径设置还是易语言的COM注册,本质都是确保运行时能找到正确依赖。不过Python的环境配置(如添加dll搜索路径)比易语言的COM注册(需管理员权限dll部署)更轻量。物理内存分配差异也值得展开:Python调用时CLR自动管理对象生命周期;而COM的引用计数机制要求易语言必须显式释放对象(否则内存泄露)。这个特性在用户的示例中未体现,但属于底层重要差异。或许用户还隐含了对“为何易语言不直接支持CLR”的疑问?这其实涉及语言设计年代——易语言诞生于.NET之前,其虚拟机架构无法适配托管代码,只能通过传统Win32交互方式。</think> Python 易语言在调用 C# DLL 时的核心差异源于运行时环境的不同,具体原理对比如下: ### 一、Python 无需 COM 注册的原因 1. **CLR 宿主机制** Python 通过 `pythonnet` 包直接加载 .NET 运行时(CLR),本质上是在 Python 进程内托管 CLR 环境,形成 $$ \text{Python} \rightarrow \text{CLR} \rightarrow \text{C# DLL} $$ 的调用链。此过程直接解析程序集元数据,无需中间接口转换[^1]。 2. **动态程序集加载** 示例代码展示动态加载能力: ```python import clr clr.AddReference(r"C:\MyCSharp.dll") # 直接加载程序集 from MyNamespace import MyClass obj = MyClass() # 直接实例化对象 ``` 这种方式跳过了 COM 所需的注册表注册类型库生成步骤。 3. **自动类型转换** Pythonnet 自动处理基本类型映射: | C# 类型 | Python 类型 | |------------|------------| | `int` | `int` | | `string` | `str` | | `double[]` | `list` | ### 二、易语言必须 COM 注册的原因 1. **非托管环境限制** 易语言是原生 Win32 应用,其调用路径为: $$ \text{易语言} \rightarrow \text{COM 代理} \rightarrow .\text{NET 互操作层} \rightarrow \text{C# DLL} $$ 需通过 COM 接口桥接非托管/托管边界。 2. **注册表依赖** COM 要求注册以下信息到注册表: ```reg [HKEY_CLASSES_ROOT\YourProject.YourClass] @="YourClass Description" [HKEY_CLASSES_ROOT\YourProject.YourClass\CLSID] @="{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}" ``` 易语言需通过这些 GUID 定位 COM 组件[^2]。 3. **接口约束** C# 必须显式定义 COM 可见接口: ```csharp [ComVisible(true)] [Guid("XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX")] public interface IMyCom { string ProcessData(string input); } ``` ### 三、关键技术对比 | **特性** | **Python/CLR** | **易语言/COM** | |------------------|-----------------------------|------------------------------| | 环境依赖 | 需安装 .NET Runtime | 需 .NET 框架 + 注册 COM | | 调用方式 | 直接加载程序集 | 通过 `创建对象("{GUID}")` | | 类型处理 | 自动类型转换 | 需手动封送 (如 `BSTR`处理) | | 部署复杂度 | 复制 DLL 即可 | 需管理员权限执行 `regasm` | | 跨版本兼容 | 支持 .NET Core/.NET 5+ | 主要支持 .NET Framework | ### 四、易语言调用示例 ```easy-language .版本 2 .程序集 测试程序 .子程序 _启动子程序 COM_初始化() .局部变量 comObj, 对象 comObj = 创建对象("{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}") .如果真 (comObj.是否成功() = 假) 信息框("COM 创建失败: " + COM_取最后错误文本(), 0, , ) 返回 .如果真结束 .局部变量 结果, 文本型 结果 = comObj.方法名("参数") 输出调试文本(结果) comObj = 空对象 // 显式释放 COM 引用 ``` ### ► 根本原理差异 Python 通过承载 CLR **直接进入托管环境**,而易语言必须通过 COM 的二进制接口标准建立 **非托管→托管的桥接通道**。这种架构差异导致 Python 调用更直接,而易语言需要额外的注册接口定义。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值