https://github.com/modular/modular/pull/4660/files
通过分析该 PR 的代码改动,我们可以总结出 Mojo 与 Python 交互的几个关键技术点:
Python 模块直接导入
from python import Python
fn use_imports() raises:
let np = Python.import_module("numpy") # 直接导入 numpy
print(np)
双向类型转换
# Python -> Mojo 转换
let py_int = Python.evaluate("42")
let mojo_int = Int(py_int)
# Mojo -> Python 转换
let mojo_str = String("Hello from Mojo")
let py_obj = mojo_str.to_python_object()
异常处理机制
fn test_import_error() raises:
try:
_ = Python.import_module("non_existent_module")
except e: # 捕获 Python 异常
assert "No module named" in str(e)
复合类型支持
# 处理 Python 字典
let py_dict = Python.evaluate("{'name': 'Mojo', 'age': 1}")
let keys = py_dict.keys()
性能优化
@always_inline
fn to_python_object(self) -> PythonObject: # 内联优化
return PythonObject(self)
关键实现总结:
动态类型适配
通过 PythonObject
类型封装所有 Python 对象
实现了 object.__getattr__
的动态方法调度
支持运算符重载(+
, []
等)
内存管理
使用引用计数管理 Python 对象生命周期
自动处理 GIL(全局解释器锁)的获取/释放
扩展性设计
通过 PythonInterface
trait 定义核心接口
支持自定义类型转换器注册
典型使用场景:
# 调用 Python 机器学习库
fn run_sklearn() raises:
let sklearn = Python.import_module("sklearn.ensemble")
let model = sklearn.RandomForestClassifier()
model.fit(training_data, labels)
let accuracy = model.score(test_data)
性能注意事项:
- 类型转换开销主要发生在边界处
- 推荐批量处理数据(如传递 Mojo 的 SIMD 类型)
- 复杂计算应尽量在 Mojo 侧完成
这个 PR 实现了 Mojo 与 Python 的双向互操作能力,使得开发者可以:
- 逐步迁移性能关键代码到 Mojo
- 复用成熟的 Python 生态系统
- 实现混合编程范式(OOP + 函数式)
- 保持与现有 Python 代码库的兼容性
测试用例展示了完整的交互场景,建议重点关注 test/python
目录下的集成测试,其中包含了典型的使用模式。