5. 在 macOS/Linux 私下设置密钥
macOS
该 bash 命令隐藏输入,避免将密钥值放在命令文本中。在同一 shell 执行查询,结束后清除变量。 使用 zsh 时先运行 bash;查询也在该 bash 会话中执行。
read -r -s -p "Materials Project API key: " MP_API_KEY
export MP_API_KEY
官方来源预期结果
查询 shell 设置了 MP_API_KEY,未打印其值。
7. 在 Windows 私下设置密钥
Windows
在 PowerShell 执行,密钥会供进程环境使用,查询结束后清除。
$atlasMpCredential = Read-Host "Materials Project API key" -AsSecureString
$env:MP_API_KEY = [System.Net.NetworkCredential]::new("", $atlasMpCredential).Password
官方来源预期结果
查询进程可读取 MP_API_KEY,未显示其值。
8. 保存小型摘要查询脚本
全部平台
保存为 materials_summary.py,只查询一个指定材料并写入新文件,输出不记录密钥。
"""Fetch a small, identified Materials Project summary using a private API key.
Sources: https://docs.materialsproject.org/downloading-data/using-the-api/getting-started
https://docs.materialsproject.org/downloading-data/using-the-api/examples
Source-reviewed example; not executed.
"""
import argparse
import json
import os
from datetime import datetime, timezone
from importlib.metadata import version
from pathlib import Path
from mp_api.client import MPRester
def main():
parser = argparse.ArgumentParser()
parser.add_argument("--material-id", default="mp-149")
parser.add_argument("--output", type=Path, default=Path("materials-summary.json"))
args = parser.parse_args()
api_key = os.environ.get("MP_API_KEY", "").strip()
if not api_key:
parser.error("Set MP_API_KEY privately; no request was sent.")
if args.output.exists():
parser.error("Choose a new output path; existing output will not be overwritten.")
try:
with MPRester(api_key) as mpr:
docs = mpr.materials.summary.search(
material_ids=[args.material_id],
fields=["material_id", "formula_pretty", "band_gap", "energy_above_hull", "is_stable"],
num_chunks=1,
chunk_size=1,
)
except Exception:
# Avoid including credential-bearing request details in shared output.
parser.exit(1, "Materials Project request failed. Check key/account, network, rate limits and installed client version privately.\n")
payload = {
"retrieved_at": datetime.now(timezone.utc).isoformat(),
"mp_api_version": version("mp-api"),
"requested_material_id": args.material_id,
"records": [
{
"material_id": str(doc.material_id),
"formula": doc.formula_pretty,
"band_gap_eV": doc.band_gap,
"energy_above_hull_eV_per_atom": doc.energy_above_hull,
"is_stable": doc.is_stable,
"source_url": "https://materialsproject.org/materials/" + str(doc.material_id),
}
for doc in docs
],
}
with args.output.open("x", encoding="utf-8") as target:
json.dump(payload, target, ensure_ascii=False, indent=2)
target.write("\n")
print("Saved", len(payload["records"]), "record(s) to", args.output)
if __name__ == "__main__":
main()
官方来源9. 获取硅材料示例
全部平台
在设置私有密钥的 shell 中执行,Windows 使用 ..venv\Scripts\python.exe;选择新的输出文件名。
.venv/bin/python materials_summary.py --material-id mp-149 --output silicon-summary.json
官方来源预期结果
实际 JSON 标识 mp-149、分子式 Si,包含时间戳与客户端版本,缺失字段保持 null。数值来自 API,不要求固定带隙;没有记录时如实说明,检查当前访问,不编造数据。