"Python" (外部计算系统)

更多信息

  • 支持 Python 3.4+.
  • 大多数情况下,Wolfram 语言会自动配置一个 Python 环境,无需用户手动配置. 对于高级配置,请按照为 ExternalEvaluate 配置 Python 工作流程中的说明进行操作.

ExternalEvaluate 的用法

  • ExternalEvaluate["Python",code] 执行 Python 代码并将结果作为 Wolfram 语言表达式返回.
  • ExternalEvaluate[{"Python","Evaluator"evaluator},code] evaluator 指定的 Python 环境执行代码.
  • ExternalEvaluate[{"Python","Evaluator"evaluator},] evaluator 可能的值包括:
  • "path"Python 可执行文件的位置
    File["path"]Python 可执行文件的位置
    Association[]虚拟环境指定
  • ExternalEvaluate[{"Python","Evaluator"assoc},] 中,assoc 可能的元素包括:
  • "Dependencies"{}用 pip 自动安装的软件包
    "EnvironmentName"Automatic待创建的虚拟环境目录的名称
    "PythonRuntime"Automatic要使用的 Python 运行时间指定,如 "3.11"File["/usr/bin/python3"]
    "BaseDirectory"Automatic创建的虚拟环境的目录
  • ExternalEvaluate["Python""type",code]"type" 可取的设置包括:
  • "Expression"尝试转换为 Wolfram 语言表达式
    "String"给出外部运算器输出的原始字符串
    "ExternalObject"ExternalObject 的形式返回结果

数据类型

  • 不支持所有 Python 内置类型. 支持的 Python 类型有:
  • boolTrue|False布尔值
    arrayNumericArray数组(来自于 NumPy 库)
    bytearrayByteArray整数 0-255 序列
    bytesByteArray整数 0-255 的不变序列
    complexComplex复数
    dateDateObject特定的日历日期
    datetimeDateObject有时间粒度的特定日期
    DecimalReal任意精度的实数
    dictionaryAssociation键和值的关联
    floatReal实数值
    FractionRational来自分式模型分式对象
    frozensetList唯一值得无序不变集合
    ImageImage图像(来自于 Python PIL 库)
    intInteger任意大小的整数
    listList值序列
    longInteger任意大小的整数
    NoneNull空值
    setList唯一值得无序集合
    strString字符值序列
    tupleList值得有序系列
  • 任何不支持的可调用的 Python 类型会返回 ExternalFunction;任何其他不支持的 Python 类型则返回 ExternalObject.
  • 当从 ExternalEvaluate 返回时,会维护由 Decimal 对象返回的 Real 的精度.
  • Python complex 类型必须是实数,因此,ExternalEvaluate 返回的任何 Complex 表达式的组成部分为实数.

支持的外部运算

使用说明

  • 字符串模板 (<**>) 可用于计算和把 Wolfram 语言表达式插入到 Python 代码字符串.

范例

打开所有单元关闭所有单元

基本范例  (3)

在 Python 中计算 并返回结果:

在 Python 中创建列表并返回结果:

键入 > 获取使用 ExternalEvaluate 计算的 Python 代码单元:

import math [math.sqrt(i) for i in range(10)]

创建带有指数和对数的列表:

[[i,math.exp(i),math.log(i)] for i in range(1,10)]

创建带有星期的日子:

import calendar [calendar.day_name[i] for i in range(7)]

File 封装运行文件中包含的代码:

CloudDeploy 部署代码,从 CloudObject 直接运行代码:

URL 封装直接运行在线上托管的代码:

可用 Association 自动配置 Python 虚拟环境:

Python 虚拟环境被创建在 $UserBaseDirectory 下:

范围  (49)

计算 Python 中的布尔语句并返回结果:

创建 Python 中的字节数组并返回 Wolfram 语言中等价的:

其他适用于 Python 中字节数组的方法:

Python 中的 listtuplesetfrozenset 被转换为 List

Python dict 被转换为 Association

在使用高于3.7 的 Python 代码时,字典键是有序的,与 Association 一样:

在 Python 中创建一个 Complex 数字并返回结果:

分数被自动转换为 Rational

小数被转换为 Real

自动转换日期-时间对象:

NumPy 数组被自动转换为 NumericArray

Pandas DataFrames 被自动转换为 Dataset

PIL 图像被自动转换为 Image

生成器被自动转换为 List

任意可迭代的 Python 对象都会被自动转换为 List,除非明确指定转换方法:

字符串模板可用于将 Wolfram 语言表达式插入 Python 代码中. 设置两个变量:

在 Wolfram 语言中计算表达式 x^2+y^2,对结果进行转换并插入到 Python 代码字符串中:

会话选项  (12)

"ReturnType"  (3)

对于 Python 运算系统,默认返回的类型是 "Expression"

对于 "Expression" 返回类型,会自动导入数字、字符串、列表和关联:

"String" 返回类型通过调用 Python 函数 repr 返回结果字符串:

"Evaluator"  (5)

用指定的 "Evaluator" 运行 Python 代码:

可用 Association 自动配置 Python 虚拟环境:

"Dependencies" 可以是指定 Python 软件包的字符串列表,使用 pip 约定指定版本:

为了指定运算器的 "Dependencies",也可以使用 File 封装:

指定 "EnvironmentName" 自定义虚拟环境文件夹的名称:

指定 "BaseDirectory" 来改变安装目录:

"PythonRuntime" 可用于下载特定版本:

通过 File 封装使用你自己的 Python:

"SessionProlog"  (1)

"SessionProlog" 在会话开始时执行一些小指令:

"SessionEpilog"  (1)

"SessionEpilog" 在会话结束时执行一些小指令:

"Prolog"  (1)

"Prolog" 在每次计算之前执行一些小指令:

"Epilog"  (1)

"Epilog" 在每次计算后执行一些小指令:

指令的选项  (11)

"Command"  (4)

当只提供一串 Python 代码时,直接执行命令:

相当于用以下形式编写命令:

File 封装运行文件中的代码:

相当于用以下形式编写命令:

URL 封装直接运行线上的代码:

相当于用以下形式编写命令:

将代码放入 CloudObject 中:

从云端直接运行:

相当于用以下形式编写命令:

"ReturnType"  (1)

默认情况下,使用会话创建时指定的 "ReturnType" 执行该命令:

在指令中指定 "ReturnType",覆盖会话的 "ReturnType"

"Arguments"  (2)

"Arguments" 调用含有参数的 Python 函数:

当提供非列表参数时,将单个参数传递给函数:

如果需要传递一个列表作为第一个参数,则必须显式地用一个额外的列表将其封装起来:

可在 "Command" 中定义一个函数,并用 "Arguments" 调用它:

可用 Rule 得到同样的结果:

也可以通过创建 ExternalFunction 来传递参数:

"Constants"  (1)

"Constants" 在命令运行之前永久设置全局变量:

"TemplateArguments"  (3)

运行命令时可内嵌一个 TemplateExpression

可用 "TemplateArguments" 填充 TemplateSlot

当提供非列表参数时,将单个模板参数传递给模板:

如果需要传递一个列表作为第一个参数,则必须显式地用一个额外的列表将其封装起来:

可以命名模板插槽,并用 Association 将已命名参数传递给模板:

外部运算  (16)

"Eval"  (1)

运行表示 Python 中任意代码运算的 ExternalOperation

用第二个参数传递运算内容:

"Call"  (3)

定义一个在 Python 中创建函数的 ExternalOperation

通过运行 ExternalOperation "Call" 定义函数调用:

ExternalEvaluate 运行表示函数调用的外部运算:

"Call" 运算的任何参数都可以是 ExternalOperation

还可以通过执行以下操作直接在 ExternalEvaluate 中传递参数:

结果相当于运行以下 Python 代码:

创建 Python 函数的 ExternalFunction

通过运行 "Call" 调用函数:

通过执行以下操作可以获得相同的结果:

创建 Pytho 函数的 ExternalFunction

通过运行 "Call" 调用函数:

通过执行以下操作可以获得相同的结果:

或使用 ExternalObject 子值:

关闭会话:

"GetAttribute"  (1)

启动 NodeJS 会话来处理日期:

返回 datetime 对象的 ExternalObject

"GetAttribute" 提取年份属性:

通过 ExternalObject 子值可以获得相同的结果:

对于 Python 运算器,"GetAttribute" 是默认运算,可以省略 ExternalOperation

结果相当于运行以下 Python 代码:

删除会话:

"SetAttribute"  (1)

启动 Python 会话来处理小数:

获取小数模块的环境:

将精度设为 6:

查看精度是否被设为 6:

结果相当于运行以下 Python 代码:

删除会话:

"GetItem"  (2)

启动 Python 会话:

创建一个 Python 字典,以 ExternalObject 的形式返回:

通过使用 "GetItem" 提取 "name":

结果相当于运行以下 Python 代码:

删除会话:

创建一个表示字典的 ExternalOperation

创建一个新的 ExternalOperation 来获取 "name":

ExternalEvaluate 执行运算:

"SetItem"  (1)

启动 Python 会话:

创建一个带有字典的 ExternalObject

"name" 设为 "joe":

查看是否被设为 "joe":

Expression 以关联形式获取整个字典:

删除会话:

"Import"  (6)

定义一个导入 "datetime" 模块的 ExternalObject

ExternalObject 形式返回模块:

定义一个 ExternalObject,从 "datetime" 模块导入日期:

给出参数,用 ExternalEvaluate 调用运算:

定义一个导入 "datetime" 模块的 ExternalObject

ExternalFunction to 调用

删除会话:

定义一个导入分数模块的 ExternalObject

通过使用 ExternalObject 子值初始化分数模块:

可用以下语句完成同样的操作:

删除会话:

定义一个 "Import" 运算,导入 "ip_address":

ExternalEvaluate 创建一个地址:

String 作为返回类型来显示该地址的 Python 字符串版本:

定义一个导入 "ip_address""Import" 运算:

用另一个 ExternalOperation 创建地址:

ExternalEvaluate 中执行运算:

"Cast"  (1)

创建表示当前日期的 ExternalObject

"Expression" 以 Wolfram 语言表达式的形式返回对象:

也可以在 ExternalObject 子值中运行 Cast 运算:

符号 Expression 是完成相同运算的更简便的方式:

用字符串返回对象:

符号 String 是完成相同运算的更简便的方式:

ExternalObject 返回对象:

符号 ExternalObject 是完成相同运算的更简便的方式:

ExternalEvaluate 中使用 "ReturnType" 可以得到同样的结果:

删除会话:

应用  (3)

在 Wolfram 语言中开放 Python range 函数:

使用函数:

创建一个使用 AST 模块返回 Python 代码字符串的 AST 的函数:

使用函数:

用 Pygments 创建一个突出显示代码中的语法的函数:

使用函数:

属性和关系  (1)

可用 从 Python 返回表达式:

在内核中传递表达式后会自动对表达式进行计算:

Hold 控制计算:

关闭会话:

可能存在的问题  (1)

生成器被自动转换为 List

返回一个无限的生成器将永远占用内核: