Engee 文档

使用 Python

一般信息

Python 是一种高级、解释型、通用编程语言。本文将具体探讨 Python 在 Engee 平台中的使用:

在 Engee 中调用 Python

通过 PyCall.jl 软件包集成 Python

*PyCall.jl*是一个允许你在Julia代码中直接调用Python函数和对象的Julia包。它在 Julia 和 Python 之间提供了一个接口,使得在 Julia 中导入 Python 模块、调用其函数、创建对象和编写代码成为可能。有关 Julia 中支持的调用命令、文字和 Python 包的更多信息,请参见PyCall.jl。 *PyCall 默认内置于 Engee 中,您无需安装或导入。

Engee 使用计算内核Julia,但你可以使用以下方法在 Engee 脚本(见 [Julia])中编写 Python 代码。 使用交互式 Engee 脚本时的特点)中编写 Python 代码:

  • Оборачивание кода на Python строковым литералом py""…​"", основанном на пакете PyCall。该字面量将字符串作为 Python 程序代码执行,不返回任何值,并执行传递的代码。

  • 使用基于 PyCall 的字符串字面量 py"…​" 封装 Python 代码。该字面量将字符串作为参数,并将其作为 Python 表达式执行。

  • 使用命令 pyimportpyevalpycall@pycallpybuiltin@pywith@pyinclude@pysym@pydef

让我们通过示例来了解这些方法。

你可以使用熟悉的 Python 语法在 Julia 中编写代码。Для этого оберните ваш код на языке Python литералами py""…​"" и py"…​", например:

py""" # оборачивает в литерал
import numpy as np # импортирует пакет numpy
"""
a = py"np.zeros(2)" # оборачивает в литерал, в котором создает одномерный массив из двух элементов, заполненный нулями

对于 pyimport 命令,代码如下:

np = pyimport("numpy")
a = np.zeros(2)

在这两个示例中,a 变量的值都是相同的。这两个例子的区别在于,在 pyimport 命令中,Julia 有一个可以直接访问的 np 对象。

在 Julia 中,像 import numpy as np 这样的 Python 命令并不能原生运行,但只要安装了 PyCall 软件包,就可以使用字符串字面量将 Python 代码直接插入 Julia 代码中。

您还可以在 Julia 中使用其他 Python 调用命令:

  • pyimport - 将 Python 模块导入 Julia,以便在 Julia 代码中使用其函数和变量。

  • pyeval - 在 Julia 上下文中执行 Python 字符串代码,并返回执行结果。

  • pycall - 用指定的参数在 Julia 中调用 Python 函数。

  • @pycall - 一个为从 Julia 调用 Python 函数提供方便语法的宏。通常比 pycall 更常用,因为它的调用更简单。

  • pybuiltin - 提供对内置 Python 函数,如 print, len, range 等的访问。

  • @pywith - 宏创建一个 Python 执行上下文,可以在其中处理 Julia 中的 Python 代码块。

  • @pyinclude - 在 Julia 中包含并执行 Python 代码文件的宏。

  • @pysym - 将 Julia 符号名称转换为相应 Python 对象的宏。

  • @pydef - 创建一个 Python 类,其方法在 Julia 中实现。

例如,pybuiltin 命令:

pybuiltin("print")("Hello, world!")

代码输出信息 Hello, world!

使用交互式 Engee 脚本时的特点

熟悉在 Engee 脚本中使用 Python 的示例:

有关在 Engee 脚本中使用 Python 的示例,请参阅此处

交互式 Engee 脚本(扩展名为 .ngscript)是在 Engee 环境中处理代码的工具 (参见脚本编辑器)。让我们来看看使用 Python 的 Engee 交互式脚本的特殊性:

  • Engee 脚本可以直接在 Engee 中创建。这是创建交互式脚本唯一支持的格式。

  • 在一个 Engee 脚本中添加软件包,无需重新安装即可在其他 Engee 脚本中使用。

  • Engee 脚本支持 Python 魔术命令,如 %run

要在 Engee 脚本中使用 Python,您可能需要许多软件包,例如科学计算支持软件包SciPy。使用软件包管理器Pkg 和 Julia 语法来安装它:

using Pkg
Pkg.add("SciPy") # установит пакет SciPy в Julia

要删除软件包,请使用 rm 命令。例如,Pkg.rm("Pluto")。更多信息,请访问使用 Julia 软件包

要了解 Engee 脚本中安装了哪些软件包,请使用

import Pkg
Pkg.status()

让我们来看一个例子。为此,让我们安装 SciPy 软件包,并使用它通过字符串字面 `py""`来查找方程的根:

py"""
from scipy.optimize import root_scalar

def func(x):
    return x**2 - 4

result = root_scalar(func, method='brentq', bracket=[0, 2])

print("Результат (корень уравнения):", result.root)
"""

让我们来详细了解一下代码:

  • from scipy.optimise import root_scalar "行从 "scipy.optimize "模块中导入了 "root_scalar "函数。该函数用于数值查找单变量方程的根。

  • def func(x): 行定义了查找根的 func 函数。通过 return 将方程 的值返回给 func 函数,而 x 是变量。

  • result = root_scalar(func,method='brentq',括号=[0, 2])`行使用 `root_scalar 函数查找 func 函数给出的方程的根。'brentq'`方法表示我们要使用的是布兰特方法。使用参数 `bracket=[0, 2],我们指定了查找方程根的区间(在我们的例子中是从 02)。

  • print("Result (root of the equation):", result.root) 行将打印找到的方程根。result.root 包含通过 root_scalar 函数找到的根值。

总之,我们使用 SciPy 软件包中的布伦特方法找到了方程 的根。将得到方程根的值:

Результат (корень уравнения): 2.0

同样,您也可以使用其他 Python 软件包,如 NumPy、Matplotlib、Pandas 等,但请记住,在 Engee 中,您无法创建不同的 Python 环境并在它们之间切换。

您可以安装的软件包数量的唯一限制是分配给 Engee 当前会话的 RAM 内存。有关可用内存的更多信息,请参见启动 Engee 会话

在 Engee 环境中使用 Python 变量

在 Python 笔记本中创建的变量(参见 "Engee 中的 Python 变量")或在 Engee 脚本中使用 Python 调用创建的变量(参见 "Engee 中的 Python 变量")将是 PyObject 类型。 在 Engee 中运行 Python 笔记本(见 "Engee 中的 Python 变量") 或在 Engee 脚本中使用 Python 调用创建的变量将是 PyObject 类型。变量的这种类型化是由于 Python 中的数据类型不等同于 Julia,Python 变量被分配了自己独特的类型来保存数据。

您可以通过直接调用方法将 Python 模块中的变量导入 Julia 变量。例如

math = pyimport("math")
math.sin(math.pi / 4)

结果值为:0.7071067811865475

在这段代码中,math = pyimport("math") 命令是通过 PyCall 软件包在 Julia 中使用的。它允许你从标准 Python 包中导入 math 模块,并将其存储在 math 变量中,以便以后在 Julia 代码中使用:

python straight method 1

PyObject 类型的变量不能导出为 .mat 格式,但可以导出为 .jld2 格式(详情请参见变量的导入和导出 ):

python variables 1

Python 变量不能用内置的 Engee 工具清除,但可以覆盖。删除变量需要重启会话。

如果需要,PyObject 变量可以在 Engee 脚本中进一步使用,但要注意 Python 数据类型与 Julia 不同。如果需要进行类型转换,建议明确给出类型:

var_jl = py"int(var_py)" #var_py — переменная с типом PyObject
println(var_jl)

其中 var_jl 是一个 Julia 变量。转换后,var_py 变量仍然是 PyObject 类型,因此我们在 Julia 中用 PyObject 类型的旧`var_py`创建了一个新的 var_jl 变量。

你可以在*Engee*脚本中使用 PyObject 类型的变量,而不需要明确地设置它们。例如,我们有一个 PyObject 类型的变量 deg。我们可以通过 println(deg) 命令访问它,例如,添加 10

println(deg + 10)

# получим PyObject 11.

变量保留了它的 PyObject 类型,我们成功地执行了数学运算。

在 Engee 中运行 Python 笔记本

您可以将 Python 笔记本(Jupyter Notebook)加载到 Engee 中,并在脚本编辑器 中运行它。让我们来看看使用 Python 笔记本的具体方法:

  • 可以使用脚本编辑器interactive script icon Engee 直接在 Engee 中创建 Python 笔记本。为此,请打开编辑器,单击 +,然后单击 Create Script 并选择 .ipynb 格式:

    img36c cn-> img36c 1 cn

  • 安装在 Engee 脚本中的软件包无法导入 Python 笔记本。每个新的 Python 笔记本都需要重新安装所需的软件包。

  • Engee 的 Python 笔记本中无法访问 Julia 魔法命令和两个用户输入函数 input()getpass()

  • Python 笔记本不支持代码延迟(如通过 sleep 函数),并会即时输出代码执行结果。

  • 您不能使用 Python 脚本(扩展名为 .py)。

  • 不能使用 conda 软件包管理工具,只能使用 pip。

使用神奇的 !pip 命令在 Python 笔记本中安装软件包:

!pip install scipy
*神奇命令是各种软件开发工具中的特殊命令。这些命令旨在执行额外的操作,对交互式编程和数据分析非常有用。

如有必要,请安装 WHL 文件中的软件包:

!pip install path/to/file.whl

WHL 是一种打包和发布 Python 软件包的归档格式。要安装 WHL 文件,首先要将其传输到文件浏览器 Engee。WHL 文件包含预编译的软件包二进制文件,使其更易于安装和管理项目依赖关系。您可以在相应 Python 软件包的官方网站上找到 WHL 文件。

要了解 Python 笔记本中安装了哪些软件包,请使用

!pip list
请查看示例,了解如何在 Engee 中使用 .ipynb :

导入自定义模块

为了将自定义模块导入 Python 笔记本,需要确保将它们的路径添加到 sys.path 变量中。默认情况下,该变量包含标准库、安装包和 Python 解释器当前工作目录的路径,而不是脚本所在的目录。要找出当前目录,可以使用 os.getcwd() 函数。如有必要,可以使用 os.chdir("path") 更改当前目录。如果模块位于其他目录下,则必须手动将其路径添加到 sys.path 中。可以使用命令

import sys
sys.path.append('/path/to/your/module')

将路径添加到 sys.path 后,就可以导入模块并使用其函数和数据。如果试图从未曾添加到 sys.path 的目录中导入模块,则会出现 ModuleNotFoundError 错误。

Python 神经网络及其与 Engee 模型的集成

查看使用 scikit-learn 库训练神经网络并从模型生成训练数据的示例:

要使用 Python 处理神经网络,Engee 在 Julia 中使用 PyCall 软件包和 Python 调用命令。例如,对于scikit-learn 库:

# установка библиотеки sklearn в Julia
using Pkg
Pkg.add("ScikitLearn")

# импорт необходимых модулей из Python в Julia
@pyimport sklearn.datasets as datasets
@pyimport sklearn.neural_network as nn
@pyimport numpy as np

要阅读使用 PyCall 在 Engee 中训练神经网络的另一个示例,请访问 链接