一架梯子,一头程序猿,仰望星空!
Mojo教程 > 内容正文

Mojo导入Python模块


Python集成

在Mojo中使用你熟悉和喜欢的Python模块非常简单。你可以将任何Python模块导入到你的Mojo程序中,并从Mojo类型创建Python类型。

导入Python模块

要在Mojo中导入一个Python模块,只需使用模块名调用Python.import_module()函数:

from python import Python

let np = Python.import_module("numpy")

array = np.array([1, 2, 3])
print(array)
[1 2 3]

是的,这样可以导入Python的NumPy模块,并且你可以导入任何其他Python模块

目前,你无法单独导入成员(例如单个Python类或函数)——你必须导入整个Python模块,然后通过模块名称访问成员。

Python中的Mojo类型

Mojo的基本类型会隐式转换为Python对象。目前我们支持列表、元组、整数、浮点数、布尔值和字符串。

例如,给定以下打印Python类型的Python函数:

%%python
def type_printer(my_list, my_tuple, my_int, my_string, my_float):
    print(type(my_list))
    print(type(my_tuple))
    print(type(my_int))
    print(type(my_string))
    print(type(my_float))

你可以毫无问题地将Mojo类型传递给Python函数:

type_printer([0, 3], (False, True), 4, "orange", 3.4)

请注意,在Jupyter笔记本中,上面声明的Python函数会自动对后续代码单元格中的任何Mojo代码可用。

Mojo还没有一个标准的字典类型,所以目前还无法从Mojo字典创建Python字典。但是你可以在Mojo中使用Python字典!要创建一个Python字典,请使用dict方法:

from python import Python
from python.object import PythonObject

var dictionary = Python.dict()
dictionary["fruit"] = "apple"
dictionary["starch"] = "potato"

var keys: PythonObject = ["fruit", "starch", "protein"]
var N: Int = keys.__len__().__index__()
print(N, "items")

for i in range(N):
    if Python.is_type(dictionary.get(keys[i]), Python.none()):
        print(keys[i], "is not in dictionary")
    else:
        print(keys[i], "is included")
3 items
fruit is included
starch is included
protein is not in dictionary

导入本地Python模块

如果你有一些本地的Python代码想要在Mojo中使用,只需将目录添加到Python路径中,然后导入模块即可。

例如,假设你有一个名为mypython.py的Python文件:

import numpy as np

def my_algorithm(a, b):
    array_a = np.random.rand(a, a)
    return array_a + b

以下是如何在Mojo文件中导入并使用它:

from python import Python

Python.add_to_path("path/to/module")
let mypython = Python.import_module("mypython")

let c = mypython.my_algorithm(2, 3)
print(c)

在Mojo中使用Python时不需要担心内存管理问题。一切都可以正常工作,因为Mojo从一开始就是为Python设计的。