Python 生态系统中充满了实用的库,因此您无需在 Mojo 中重写它们。您只需导入 Python 包并从 Mojo 调用 Python API 即可。Python 代码在标准 Python 解释器 (CPython) 中运行,因此您现有的 Python 代码无需更改。
在Mojo
要在 Mojo 中导入 Python 模块,只需使用模块名称调用即可 。以下是导入标准 Python NumPyPython.import_module()
包 的示例:
🔥 Mojo
from python import Pythondef main(): # This is equivalent to Python's `import numpy as np` np = Python.import_module("numpy") # Now use numpy as if writing in Python array = np.array(Python.list(1, 2, 3)) print(array)
运行该程序会产生以下输出:
[1 2 3]
假设您的 环境中安装了 NumPy 包,这将导入 NumPy 并且您可以使用它的任何功能。
需要注意以下几点:
该import_module()
方法以包装器的形式返回对模块的引用PythonObject
。您必须将该引用存储在变量中,然后像上例所示那样使用它来访问模块定义的函数、类和其他对象。 有关该类型的更多信息,请参阅Mojo 包装器对象PythonObject
。
目前,您无法导入单个成员(例如单个 Python 类或函数)。您必须导入整个 Python 模块,然后通过模块名称访问成员。
Mojo 尚不支持顶层代码,因此import_module()
调用必须在另一个方法内部进行。这意味着您可能需要多次导入模块或传递对模块的引用。这与 Python 的工作方式相同:多次导入模块不会多次运行初始化逻辑,因此您不会承担任何性能损失。
import_module()
可能会引发异常(例如,如果模块未安装)。如果您在fn
函数内部使用它,则需要处理错误(使用try/except
子句),或者将raises
关键字添加到函数签名中。在调用可能引发异常的 Python 函数时也会出现这种情况。(在 Python 代码中引发异常的情况比在 Mojo 标准库中更常见, 出于性能原因,这限制了它们的使用。)
警告
mojo build
不包含 Mojo 项目使用的 Python 包。相反,Mojo 会在运行时加载 Python 解释器和 Python 包,因此必须在运行 Mojo 程序的环境中提供它们(例如,在构建可执行文件的 Magic 环境中)。有关更多信息,请参阅上面创建 Python 环境的部分。
导入本地 Python模块
如果您有一些想要在 Mojo 中使用的本地 Python 代码,只需将目录添加到 Python 路径,然后导入模块。
例如,假设您有一个名为的 Python 文件mypython.py
:
🐍 mypython.py
import numpy as npdef gen_random_values(size, base): # generate a size x size array of random numbers between base and base+1 random_array = np.random.rand(size, size) return random_array + base
以下是如何导入并在 Mojo 文件中使用它的方法:
🔥 main.mojo
from python import Pythondef main(): Python.add_to_path("path/to/module") mypython = Python.import_module("mypython") values = mypython.gen_random_values(2, 3) print(values)
绝对路径和相对路径都可以使用 add_to_path()
。例如,你可以像这样从本地目录导入:
🔥 Mojo
Python.add_to_path(".")