- 通过命令行调用 Wolfram Engine (推荐,功能最强大)
- 使用 Wolfram Client Library for Python (轻量级,嵌入Python脚本)
下面我将详细介绍这两种方法,包括它们的原理、优缺点和具体操作步骤。

核心概念:Wolfram Engine
无论哪种方法,你都需要一个东西:Wolfram Engine,这是Mathematica的核心计算引擎,它是一个独立的、免费的命令行程序,你可以把它想象成一个强大的数学计算“后端”,而Mathematica桌面版是它的“图形前端”,安装了Wolfram Engine,你的电脑就有了执行Wolfram Language代码的能力。
第一步:安装 Wolfram Engine
- 访问下载页面:前往 Wolfram Engine 官方下载页面。
- 选择系统:根据你的操作系统(Windows, macOS, Linux)选择对应的版本。
- 登录并下载:你需要创建一个免费的 Wolfram ID 并登录才能下载,这是Wolfram官方的要求。
- 安装:像安装普通软件一样完成安装,安装过程中,确保将Wolfram Engine的路径添加到系统的环境变量
PATH中,这样命令行才能找到它,安装程序通常会自动帮你完成。
安装完成后,你可以在终端(或命令提示符)中输入 wolframscript 来验证是否安装成功,如果看到命令行提示符 In[1]:=,说明安装成功。
通过命令行调用 Wolfram Engine (推荐)
这种方法的核心思想是:在Python脚本中,像执行系统命令一样,调用 wolframscript 来运行你的Mathematica代码,并捕获其输出结果。

优点
- 功能完整:可以运行任何Wolfram Language代码,包括复杂的图形、交互式控件等。
- 解耦性好:Python和Mathematica是两个独立的进程,相互影响小。
- 适合批处理:非常适合将Mathematica作为强大的计算后端,用于一次性处理大量任务。
缺点
- 有启动开销:每次调用
wolframscript都会启动一个新的进程,对于频繁的、小型的计算来说效率不高。 - 数据交互复杂:需要处理字符串的拼接和解析,将Python数据转换为Wolfram Language可读的格式,并将结果从字符串解析回Python数据结构。
实现步骤
我们将使用Python的 subprocess 模块。
示例1:执行简单的表达式
我们想用Python计算 Factorial[10]。
import subprocess
import json
# 要执行的 Wolfram Language 代码
# 注意:使用 -c 参数来执行代码字符串
command = 'wolframscript -c "Factorial[10]"'
try:
# 执行命令
# shell=True 允许我们直接传入一个字符串命令
# capture_output=True 捕获标准输出和标准错误
# text=True 将输出解码为文本
result = subprocess.run(command, shell=True, capture_output=True, text=True, check=True)
# result.stdout 会捕获到 "Out[1]= 3628800" 这样的字符串
# 我们需要提取 "Out[1]= " 之后的部分
output_string = result.stdout.strip()
# 使用 split 方法提取结果
# 对于更复杂的结构,最好使用 JSON
answer = output_string.split('=')[1].strip()
print(f"Python 接收到原始输出: '{output_string}'")
print(f"解析后的计算结果是: {answer}")
print(f"结果的类型是: {type(answer)}")
except subprocess.CalledProcessError as e:
print(f"执行 Wolfram 代码时出错!")
print(f"错误码: {e.returncode}")
print(f"错误信息: {e.stderr}")
示例2:传递参数并解析复杂数据(JSON方法)

这是更实用、更稳健的方法,我们将Python数据通过JSON传递给Wolfram Engine,并将结果以JSON格式返回。
import subprocess
import json
# Python 中的数据
python_data = [1, 2, 3, 4, 5]
# 将Python数据转换为JSON字符串,作为参数传递给 Wolfram Language
# Wolfram Language 可以直接解析JSON字符串
json_data_string = json.dumps(python_data)
# 构建命令
# -f 表示从一个文件读取代码,但这里我们用 -c 执行一个完整的脚本
# 在脚本中,我们导入 JSON 函数,解析数据,进行计算,再将结果转为JSON字符串输出
command = f'wolframscript -c <<EOF\n\
Needs["`JSON`"];\n\
data = ImportString["{json_data_string}", "JSON"];\n\
result = Total[data];\n\
ExportString[result, "JSON"]\\
EOF'
print(f"执行的命令是: {command}\n")
try:
result = subprocess.run(command, shell=True, capture_output=True, text=True, check=True, encoding='utf-8')
# Wolfram Engine 输出的结果是一个JSON字符串
result_json_string = result.stdout.strip()
# 将JSON字符串解析回Python对象
final_answer = json.loads(result_json_string)
print(f"Python 接收到JSON格式的输出: '{result_json_string}'")
print(f"解析后的最终结果是: {final_answer}")
print(f"结果的类型是: {type(final_answer)}")
except subprocess.CalledProcessError as e:
print(f"执行 Wolfram 代码时出错!")
print(f"错误码: {e.returncode}")
print(f"错误信息: {e.stderr}")
使用 Wolfram Client Library for Python
这种方法是官方提供的Python库,它允许你直接在Python进程中嵌入一个Wolfram Engine,无需通过命令行。
优点
- 高性能:没有进程启动的开销,适合需要频繁调用的场景。
- 数据交互简单:库会自动处理Python和Wolfram Language数据类型之间的转换。
- 代码更优雅:调用方式更面向对象,代码更清晰。
缺点
- 需要额外安装库:需要通过
pip安装wolframclient。 - 功能限制:无法直接执行需要图形界面的代码(如
Manipulate)。 - 耦合性强:Wolfram Engine的生命周期与Python脚本绑定。
实现步骤
第一步:安装客户端库
pip install wolframclient
第二步:编写Python代码
from wolframclient.evaluation import WolframLanguageSession
from wolframclient.language import wl, wlexpr
# 指定 Wolfram Engine 的路径(可选,如果它在PATH中则不需要)
# engine = '/path/to/your/WolframEngine'
# session = WolframLanguageSession(engine)
# 创建一个 Wolfram Language 会话
# 这会启动一个嵌入式的 Wolfram Engine 进程
with WolframLanguageSession() as session:
print("Wolfram Engine 会话已启动。")
# 示例1:执行简单表达式
# wl 是 Wolfram Language 的 Python 映射,如 wl.Plus 对应 Plus
# 或者使用 wlexpr("...") 来执行字符串形式的代码
result1 = session.evaluate(wl.Plus(1, 2, 3, 4, 5))
print(f"1+2+3+4+5 的结果是: {result1}")
print(f"结果的类型是: {type(result1)}")
# 示例2:传递列表并计算
python_list = [1, 2, 3, 4, 5]
# Python列表会自动转换为 Wolfram Language 的 List
result2 = session.evaluate(wl.Total(python_list))
print(f"列表 {python_list} 的总和是: {result2}")
# 示例3:执行复杂的字符串代码
# 注意:wlexpr 会执行代码,并返回最后一个表达式的结果
code_to_run = 'N[Pi, 100]' # 计算100位精度的Pi
result3 = session.evaluate(wlexpr(code_to_run))
print(f"计算 {code_to_run} 的结果是:\n{result3}")
# 会话退出 with 代码块时会自动关闭
print("Wolfram Engine 会话已关闭。")
数据类型转换对照表
这个库非常智能,能自动转换常用数据类型:
| Python 类型 | Wolfram Language 类型 |
|---|---|
int, float |
Integer, Real |
bool |
True, False (布尔值) |
str |
String |
list, tuple |
List |
dict |
Association (关联列表) |
None |
Null |
datetime |
DateObject |
总结与选择
| 特性 | 方法一 (命令行调用) | 方法二 (客户端库) |
|---|---|---|
| 易用性 | 较低,需处理字符串和JSON | 高,直接面向对象调用 |
| 性能 | 较低,有进程启动开销 | 高,无启动开销,适合高频调用 |
| 功能完整性 | 高,可执行任何代码(包括图形) | 较低,无法执行图形界面代码 |
| 数据交互 | 复杂,需手动序列化/反序列化 | 简单,库自动处理类型转换 |
| 依赖 | 仅需 Wolfram Engine | Wolfram Engine + wolframclient Python库 |
| 适用场景 | - 执行一次性、复杂的计算任务 - 生成图形、PDF等文件 - 作为独立的计算后端 |
- 需要在Python中频繁调用Wolfram函数 - 构建混合了Python和Wolfram Language的应用程序 |
如何选择?
- 如果你只是想在Python脚本中偶尔调用一下Mathematica来完成一个复杂的数学计算或绘图,并且不关心性能,方法一足够用了。
- 如果你正在构建一个以Python为主,但需要Wolfram Language强大计算能力的应用程序,或者你需要在一个循环中反复调用Wolfram函数,那么强烈推荐方法二,它的性能和易用性都远胜于方法一。
