使用 Python
一般信息
Python 是一种高级、解释型、通用编程语言。本文将具体探讨 Python 在 Engee 平台中的使用:
-
通过 PyCall.jl 软件包集成 Python- 借助 PyCall 软件包,在 Engee 脚本中编写 Python 代码;
-
使用交互式 Engee 脚本时的特点- 了解 Engee 脚本的功能,安装必要的 Python 软件包;
-
在 Engee 环境中使用 Python 变量- 在 Engee 脚本中使用 Python 变量;
-
在 Engee 中运行 Python 笔记本- 运行自己的 Python 笔记本,将其从外部开发环境直接导入 Engee;
-
Python 神经网络及其与 Engee 模型的集成- 使用基于 Engee 模型的 Python 库构建和训练神经网络。
在 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 表达式执行。 -
使用命令
pyimport
、pyeval
、pycall
、@pycall
、pybuiltin
、@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 中,像 |
您还可以在 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
。
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]
,我们指定了查找方程根的区间(在我们的例子中是从0
到2
)。 -
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 代码中使用:
PyObject 类型的变量不能导出为 .mat 格式,但可以导出为 .jld2 格式(详情请参见变量的导入和导出 ):
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 笔记本的具体方法:
-
可以使用脚本编辑器
Engee 直接在 Engee 中创建 Python 笔记本。为此,请打开编辑器,单击 +,然后单击 Create Script 并选择 .ipynb 格式:
->
-
安装在 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 中训练神经网络的另一个示例,请访问 链接。