Python互操作 #

一、Python互操作概述 #

1.1 为什么需要Python互操作 #

  • 利用丰富的Python生态
  • 渐进式迁移现有代码
  • 快速原型开发
  • 结合两者优势

1.2 Mojo与Python的关系 #

Mojo是Python的超集:

  • 兼容Python语法
  • 可以调用Python模块
  • 支持Python对象

二、导入Python模块 #

2.1 基本导入 #

mojo
from python import Python

def main():
    let np = Python.import_module("numpy")
    
    let arr = np.array([1, 2, 3, 4, 5])
    print(arr)
    print(arr.mean())

main()

2.2 导入多个模块 #

mojo
from python import Python

def main():
    let np = Python.import_module("numpy")
    let pd = Python.import_module("pandas")
    let plt = Python.import_module("matplotlib.pyplot")
    
    let data = np.array([1, 2, 3, 4, 5])
    print(data)

main()

2.3 导入特定函数 #

mojo
from python import Python

def main():
    let math = Python.import_module("math")
    
    let pi = math.pi
    let e = math.e
    
    print(f"Pi: {pi}")
    print(f"e: {e}")
    print(f"sin(1): {math.sin(1)}")

main()

三、Python对象操作 #

3.1 创建Python对象 #

mojo
from python import Python

def main():
    let List = Python.import_module("builtins").list
    let Dict = Python.import_module("builtins").dict
    
    let py_list = List([1, 2, 3, 4, 5])
    let py_dict = Dict({"a": 1, "b": 2})
    
    print(py_list)
    print(py_dict)

main()

3.2 调用Python方法 #

mojo
from python import Python

def main():
    let np = Python.import_module("numpy")
    
    let arr = np.array([1, 2, 3, 4, 5])
    
    print(f"Mean: {arr.mean()}")
    print(f"Std: {arr.std()}")
    print(f"Max: {arr.max()}")
    print(f"Min: {arr.min()}")

main()

3.3 访问Python属性 #

mojo
from python import Python

def main():
    let np = Python.import_module("numpy")
    
    let arr = np.array([[1, 2], [3, 4]])
    
    print(f"Shape: {arr.shape}")
    print(f"Dtype: {arr.dtype}")
    print(f"Size: {arr.size}")

main()

四、数据类型转换 #

4.1 Mojo到Python #

mojo
from python import Python

def main():
    let py = Python.import_module("builtins")
    
    let mojo_int: Int = 42
    let mojo_float: Float64 = 3.14
    let mojo_str: String = "Hello"
    let mojo_list: List[Int] = [1, 2, 3]
    
    let py_int = Python.object(mojo_int)
    let py_float = Python.object(mojo_float)
    let py_str = Python.object(mojo_str)
    
    print(py_int)
    print(py_float)
    print(py_str)

main()

4.2 Python到Mojo #

mojo
from python import Python

def main():
    let np = Python.import_module("numpy")
    
    let py_arr = np.array([1, 2, 3, 4, 5])
    
    let mojo_list: List[Int] = []
    for i in range(len(py_arr)):
        mojo_list.append(Int(py_arr[i]))
    
    print(mojo_list)

main()

4.3 数组转换 #

mojo
from python import Python

def main():
    let np = Python.import_module("numpy")
    
    let py_arr = np.array([1.0, 2.0, 3.0, 4.0, 5.0])
    
    let size = len(py_arr)
    let mojo_arr = Pointer[Float64].alloc(size)
    
    for i in range(size):
        mojo_arr.store(i, Float64(py_arr[i]))
    
    for i in range(size):
        print(mojo_arr.load(i))
    
    mojo_arr.free()

main()

五、NumPy集成 #

5.1 创建NumPy数组 #

mojo
from python import Python

def main():
    let np = Python.import_module("numpy")
    
    let arr1 = np.array([1, 2, 3, 4, 5])
    let arr2 = np.zeros(5)
    let arr3 = np.ones((3, 3))
    let arr4 = np.arange(0, 10, 2)
    
    print(arr1)
    print(arr2)
    print(arr3)
    print(arr4)

main()

5.2 数组运算 #

mojo
from python import Python

def main():
    let np = Python.import_module("numpy")
    
    let a = np.array([1, 2, 3, 4, 5])
    let b = np.array([5, 4, 3, 2, 1])
    
    let sum = a + b
    let product = a * b
    let dot = np.dot(a, b)
    
    print(f"Sum: {sum}")
    print(f"Product: {product}")
    print(f"Dot product: {dot}")

main()

5.3 矩阵操作 #

mojo
from python import Python

def main():
    let np = Python.import_module("numpy")
    
    let A = np.array([[1, 2], [3, 4]])
    let B = np.array([[5, 6], [7, 8]])
    
    let C = np.matmul(A, B)
    let det = np.linalg.det(A)
    let inv = np.linalg.inv(A)
    
    print(f"Matrix product:\n{C}")
    print(f"Determinant: {det}")
    print(f"Inverse:\n{inv}")

main()

六、Pandas集成 #

6.1 创建DataFrame #

mojo
from python import Python

def main():
    let pd = Python.import_module("pandas")
    
    let df = pd.DataFrame({
        "name": ["Alice", "Bob", "Charlie"],
        "age": [25, 30, 35],
        "city": ["Beijing", "Shanghai", "Guangzhou"]
    })
    
    print(df)
    print(df.head())
    print(df.describe())

main()

6.2 数据操作 #

mojo
from python import Python

def main():
    let pd = Python.import_module("pandas")
    
    let df = pd.DataFrame({
        "name": ["Alice", "Bob", "Charlie"],
        "age": [25, 30, 35]
    })
    
    print(df["age"].mean())
    print(df[df["age"] > 25])
    print(df.sort_values("age"))

main()

七、Matplotlib集成 #

7.1 基本绑图 #

mojo
from python import Python

def main():
    let plt = Python.import_module("matplotlib.pyplot")
    let np = Python.import_module("numpy")
    
    let x = np.linspace(0, 10, 100)
    let y = np.sin(x)
    
    plt.figure()
    plt.plot(x, y)
    plt.title("Sine Wave")
    plt.xlabel("x")
    plt.ylabel("sin(x)")
    plt.savefig("sine_wave.png")

main()

7.2 多图绘制 #

mojo
from python import Python

def main():
    let plt = Python.import_module("matplotlib.pyplot")
    let np = Python.import_module("numpy")
    
    let x = np.linspace(0, 10, 100)
    
    plt.figure(figsize=(10, 6))
    
    plt.subplot(2, 1, 1)
    plt.plot(x, np.sin(x))
    plt.title("Sine")
    
    plt.subplot(2, 1, 2)
    plt.plot(x, np.cos(x))
    plt.title("Cosine")
    
    plt.tight_layout()
    plt.savefig("trig_functions.png")

main()

八、混合编程 #

8.1 Python原型 + Mojo优化 #

mojo
from python import Python

fn fast_computation(data: List[Float64]) -> Float64:
    var sum: Float64 = 0.0
    for val in data:
        sum += val * val
    return sum

def main():
    let np = Python.import_module("numpy")
    
    let py_data = np.random.rand(1000000)
    
    var mojo_data: List[Float64] = []
    for i in range(len(py_data)):
        mojo_data.append(Float64(py_data[i]))
    
    let result = fast_computation(mojo_data)
    print(f"Result: {result}")

main()

8.2 使用Python库处理,Mojo计算 #

mojo
from python import Python

fn mojo_process(data: List[Float64]) -> List[Float64]:
    var result: List[Float64] = []
    for val in data:
        result.append(val * 2.0 + 1.0)
    return result

def main():
    let pd = Python.import_module("pandas")
    
    let df = pd.read_csv("data.csv")
    let column = df["value"]
    
    var mojo_data: List[Float64] = []
    for i in range(len(column)):
        mojo_data.append(Float64(column[i]))
    
    let processed = mojo_process(mojo_data)
    
    df["processed"] = processed
    df.to_csv("output.csv", index=False)

main()

九、最佳实践 #

9.1 减少Python调用 #

mojo
from python import Python

def main():
    let np = Python.import_module("numpy")
    
    let arr = np.array([1, 2, 3, 4, 5])
    
    let mean = arr.mean()
    let std = arr.std()
    let var = arr.var()
    
    print(f"Mean: {mean}, Std: {std}, Var: {var}")

main()

9.2 批量数据传输 #

mojo
from python import Python

def main():
    let np = Python.import_module("numpy")
    
    let py_arr = np.arange(1000000)
    
    let mojo_ptr = Pointer[Float64].alloc(1000000)
    
    for i in range(1000000):
        mojo_ptr.store(i, Float64(py_arr[i]))
    
    mojo_ptr.free()

main()

9.3 错误处理 #

mojo
from python import Python

def main():
    try:
        let module = Python.import_module("nonexistent_module")
    except:
        print("Module not found")
    
    print("Continuing execution")

main()

十、总结 #

本章学习了:

  • Python模块导入
  • Python对象操作
  • 数据类型转换
  • NumPy集成
  • Pandas集成
  • Matplotlib集成
  • 混合编程
  • 最佳实践

恭喜你完成Mojo语言的学习!现在你已经掌握了从基础到高级的Mojo编程知识。

最后更新:2026-03-27