"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 类型有:
-
bool TrueFalse 布尔值 array NumericArray 数组(来自于 NumPy 库) bytearray ByteArray 整数 0-255 序列 bytes ByteArray 整数 0-255 的不变序列 complex Complex 复数 date DateObject 特定的日历日期 datetime DateObject 有时间粒度的特定日期 Decimal Real 任意精度的实数 dictionary Association 键和值的关联 float Real 实数值 Fraction Rational 来自分式模型分式对象 frozenset List 唯一值得无序不变集合 Image Image 图像(来自于 Python PIL 库) int Integer 任意大小的整数 list List 值序列 long Integer 任意大小的整数 None Null 空值 set List 唯一值得无序集合 str String 字符值序列 tuple List 值得有序系列 - 任何不支持的可调用的 Python 类型会返回 ExternalFunction;任何其他不支持的 Python 类型则返回 ExternalObject.
- 当从 ExternalEvaluate 返回时,会维护由 Decimal 对象返回的 Real 的精度.
- Python complex 类型必须是实数,因此,ExternalEvaluate 返回的任何 Complex 表达式的组成部分为实数.
支持的外部运算
- ExternalOperation["Eval","code"]表示 "code" 的外部运算.
- ExternalOperation["Eval","code",assoc] 示 "code" 的外部运算,参数由 assoc 给出.
- ExternalOperation["Call",func,arg1,arg2,…] 调用函数 func,给定参数为 arg1、arg2、….
- ExternalOperation["GetAttribute",obj,"attr"] 获取 obj 的属性 "attr".
- ExternalOperation["SetAttribute",obj,"attr",val] 将 obj 的属性 "attr" 设为给定值 val.
- ExternalOperation["GetItem",obj,"item"] 获取 obj 的项 "item".
- ExternalOperation["SetItem",obj,"item",val] 将 obj 的项 "item" 设为给定值 val.
- ExternalOperation["Import","path"] 导入模块 "path".
- ExternalOperation["Import","path","attr"] 导入模块 "path",然后从模块获取属性 "attr".
- ExternalOperation["Cast",obj,"type"]将 obj 强制设为给定的 "type".
范例
打开所有单元关闭所有单元基本范例 (3)
键入 > 获取使用 ExternalEvaluate 计算的 Python 代码单元:
用 File 封装运行文件中包含的代码:
用 CloudDeploy 部署代码,从 CloudObject 直接运行代码:
用 URL 封装直接运行在线上托管的代码:
可用 Association 自动配置 Python 虚拟环境:
Python 虚拟环境被创建在 $UserBaseDirectory 下:
范围 (49)
创建 Python 中的字节数组并返回 Wolfram 语言中等价的:
Python 中的 list、tuple、set 和 frozenset 被转换为 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" 自定义虚拟环境文件夹的名称:
通过 File 封装使用你自己的 Python:
指令的选项 (11)
"Command" (4)
"Arguments" (2)
用 "Arguments" 调用含有参数的 Python 函数:
如果需要传递一个列表作为第一个参数,则必须显式地用一个额外的列表将其封装起来:
可在 "Command" 中定义一个函数,并用 "Arguments" 调用它:
可用 Rule 得到同样的结果:
也可以通过创建 ExternalFunction 来传递参数:
"TemplateArguments" (3)
运行命令时可内嵌一个 TemplateExpression:
可用 "TemplateArguments" 填充 TemplateSlot:
如果需要传递一个列表作为第一个参数,则必须显式地用一个额外的列表将其封装起来:
可以命名模板插槽,并用 Association 将已命名参数传递给模板:
外部运算 (16)
"Eval" (1)
"Call" (3)
定义一个在 Python 中创建函数的 ExternalOperation:
通过运行 ExternalOperation "Call" 定义函数调用:
用 ExternalEvaluate 运行表示函数调用的外部运算:
"Call" 运算的任何参数都可以是 ExternalOperation:
还可以通过执行以下操作直接在 ExternalEvaluate 中传递参数:
创建 Python 函数的 ExternalFunction:
创建 Pytho 函数的 ExternalFunction:
或使用 ExternalObject 子值:
"GetAttribute" (1)
返回 datetime 对象的 ExternalObject:
通过 ExternalObject 子值可以获得相同的结果:
对于 Python 运算器,"GetAttribute" 是默认运算,可以省略 ExternalOperation:
"GetItem" (2)
创建一个 Python 字典,以 ExternalObject 的形式返回:
创建一个表示字典的 ExternalOperation:
创建一个新的 ExternalOperation 来获取 "name":
用 ExternalEvaluate 执行运算:
"SetItem" (1)
创建一个带有字典的 ExternalObject:
用 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)
属性和关系 (1)
可能存在的问题 (1)
生成器被自动转换为 List: