杰瑞科技汇

python运行mathematica

  1. 通过命令行调用 Wolfram Engine (推荐,功能最强大)
  2. 使用 Wolfram Client Library for Python (轻量级,嵌入Python脚本)

下面我将详细介绍这两种方法,包括它们的原理、优缺点和具体操作步骤。

python运行mathematica-图1
(图片来源网络,侵删)

核心概念:Wolfram Engine

无论哪种方法,你都需要一个东西:Wolfram Engine,这是Mathematica的核心计算引擎,它是一个独立的、免费的命令行程序,你可以把它想象成一个强大的数学计算“后端”,而Mathematica桌面版是它的“图形前端”,安装了Wolfram Engine,你的电脑就有了执行Wolfram Language代码的能力。

第一步:安装 Wolfram Engine

  1. 访问下载页面:前往 Wolfram Engine 官方下载页面
  2. 选择系统:根据你的操作系统(Windows, macOS, Linux)选择对应的版本。
  3. 登录并下载:你需要创建一个免费的 Wolfram ID 并登录才能下载,这是Wolfram官方的要求。
  4. 安装:像安装普通软件一样完成安装,安装过程中,确保将Wolfram Engine的路径添加到系统的环境变量 PATH 中,这样命令行才能找到它,安装程序通常会自动帮你完成。

安装完成后,你可以在终端(或命令提示符)中输入 wolframscript 来验证是否安装成功,如果看到命令行提示符 In[1]:=,说明安装成功。


通过命令行调用 Wolfram Engine (推荐)

这种方法的核心思想是:在Python脚本中,像执行系统命令一样,调用 wolframscript 来运行你的Mathematica代码,并捕获其输出结果

python运行mathematica-图2
(图片来源网络,侵删)

优点

  • 功能完整:可以运行任何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运行mathematica-图3
(图片来源网络,侵删)

这是更实用、更稳健的方法,我们将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函数,那么强烈推荐方法二,它的性能和易用性都远胜于方法一。
分享:
扫描分享到社交APP
上一篇
下一篇