如何在 Python 中使用 Claude API

发布: (2026年5月3日 GMT+8 18:06)
9 分钟阅读
原文: Dev.to

Source: Dev.to

你有一个 Python 脚本。你希望它能思考。

这就是整个前提。本教程展示如何将你的代码连接到 Claude — Anthropic 的 AI 模型 — 使其能够在你的项目中读取、推理并作出响应。

我在自己花了一个下午弄清楚后写了这篇。无需任何 AI 经验。如果你以前写过 Python 函数,就可以跟着做。

开始之前

有两件事值得提前了解。

  1. API 需要付费。
    并不多——$5 就能支撑数周的正常使用——但它不像 Claude.ai 聊天界面那样免费。你需要在 处充值。

  2. 你需要 Python 3.9 或更高版本。
    检查你的版本:

    python --version

    如果低于 3.9,请在 处更新。
    在 Windows 上,安装时务必勾选 “Add Python to PATH”;如果跳过会导致所有功能失效。

设置

创建一个文件夹,设置虚拟环境并安装 SDK。

mkdir claude-project
cd claude-project
python -m venv venv

激活环境:

# macOS / Linux
source venv/bin/activate

# Windows
venv\Scripts\activate

你的终端提示符现在应该以 (venv) 开头。这就是它已激活的标志。如果在未激活 venv 的情况下安装包,它们会被放到错误的位置。

pip install anthropic python-dotenv

您的 API 密钥

  1. 前往,创建账户,并在 API Keys 下生成密钥。

  2. 将其存放在项目文件夹中的 .env 文件里:

    ANTHROPIC_API_KEY=your-key-here
  3. 将该文件排除在版本控制之外:

    echo .env > .gitignore

为什么? 公共的 API 密钥会在数小时内被发现、使用并产生费用。

Source:

第一次调用

下面展示了在 Python 中与 Claude 对话的示例:

from dotenv import load_dotenv
from anthropic import Anthropic

load_dotenv()
client = Anthropic()

message = client.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=1024,
    messages=[
        {
            "role": "user",
            "content": "What is a REST API?"
        }
    ]
)

print(message.content[0].text)

运行脚本——Claude 会在终端中给出回答。

关于此调用需要了解的三件事

参数含义
model使用的 Claude 版本。claude-sonnet-4-6 是大多数用例的默认选择——快速且功能强大。
max_tokensClaude 响应的最大长度。设置得太低会导致回复在句子中途被截断。1024 是一个安全的起始值。
messages对话中的回合列表。每个回合都有一个 roleuser 表示你的消息,assistant 表示 Claude)。

返回的内容

响应对象不仅仅包含文本:

print(message.content[0].text)          # Claude's response
print(message.stop_reason)              # Why it stopped — usually "end_turn"
print(message.usage.input_tokens)        # Tokens in your message
print(message.usage.output_tokens)     # Tokens in Claude's reply

Token 大致相当于一个词。关注它们很重要,因为这关系到你的费用。

为 Claude 指定角色

默认情况下,Claude 是一个通用助理。系统提示 可以改变这一点。可以把它看作是在对话开始前给出的简报:

message = client.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=1024,
    system="You are a Python code reviewer. Be direct. Point out issues first, then explain why.",
    messages=[
        {
            "role": "user",
            "content": "Review this: for i in range(len(my_list)): print(my_list[i])"
        }
    ]
)

print(message.content[0].text)

相同的模型,却表现出完全不同的行为。系统提示是实现大部分真实控制的关键所在。

对话

API 没有记忆。每次调用都会重新开始,除非你自行传入历史记录。

from dotenv import load_dotenv
from anthropic import Anthropic

load_dotenv()
client = Anthropic()

history = []

def chat(message: str) -> str:
    # Add the user message to the history
    history.append({"role": "user", "content": message})

    response = client.messages.create(
        model="claude-sonnet-4-6",
        max_tokens=1024,
        system="You are a helpful programming assistant.",
        messages=history
    )

    # Extract Claude's reply and add it to the history
    reply = response.content[0].text
    history.append({"role": "assistant", "content": reply})

    return reply

print(chat("What is a decorator in Python?"))
print(chat("Show me a real example."))
print(chat("How would that work in Flask?"))

每次调用都会传入完整的 history。Claude 会读取它,理解上下文,并继续对话。

常见错误: 只追加了用户消息,却忘记追加 Claude 的回复。如果这样做,下一次请求就没有上下文,Claude 会像对话从未发生过一样作答。

流式传输

等待完整响应后再打印任何内容对脚本来说没问题,但对任何面向用户的场景,流式传输的体验要好得多。

from dotenv import load_dotenv
from anthropic import Anthropic

load_dotenv()
client = Anthropic()

with client.messages.stream(
    model="claude-sonnet-4-6",
    max_tokens=1024,
    messages=[
        {"role": "user", "content": "Explain recursion simply."}
    ]
) as stream:
    for text in stream.text_stream:
        print(text, end="", flush=True)

文本会逐个 token 显示,给人一种实时对话的感觉。

实时流式传输

不必等待,文字会在 Claude 生成时即时出现——这正是 Claude.ai 界面中提供的体验。

实际案例

这里有一个值得保留的函数。它可以对你传入的任何文本进行摘要:

from dotenv import load_dotenv
from anthropic import Anthropic

load_dotenv()
client = Anthropic()

def summarize(text: str, sentences: int = 3) -> str:
    response = client.messages.create(
        model="claude-sonnet-4-6",
        max_tokens=512,
        system=f"Summarize the following text in {sentences} sentences. Return only the summary.",
        messages=[{"role": "user", "content": text}]
    )
    return response.content[0].text

article = """
The James Webb Space Telescope has captured the deepest infrared image
of the universe ever taken. The image covers a patch of sky approximately
the size of a grain of sand held at arm's length. It contains thousands
of galaxies, some of which formed less than a billion years after the
Big Bang. Scientists believe this data will reshape our understanding
of how the earliest galaxies formed and evolved.
"""

print(summarize(article, sentences=2))

更改系统提示后,它可以变成翻译器、分类器或数据提取器。模式始终相同。

处理错误

网络会失败。速率限制会出现。包装你的调用:

from dotenv import load_dotenv
from anthropic import Anthropic, APIError, RateLimitError, APIConnectionError

load_dotenv()
client = Anthropic()

def ask(question: str) -> str:
    try:
        response = client.messages.create(
            model="claude-sonnet-4-6",
            max_tokens=1024,
            messages=[{"role": "user", "content": question}]
        )
        return response.content[0].text

    except RateLimitError:
        return "Rate limit reached. Wait a moment and try again."

    except APIConnectionError:
        return "Connection failed. Check your internet."

    except APIError as e:
        return f"API error {e.status_code}."

选择模型

模型使用场景
claude-sonnet-4-6大多数情况。快速、能力强、性价比高
claude-opus-4-6需要深度推理的难题
claude-haiku-4-5-20251001大批量、简单任务,成本最低

首先使用 Sonnet。如有需要可切换。

会让你措手不及的事项

  • API 是收费的。Claude.ai 的网页 UI 不收费。开始前请先充值。
  • load_dotenv() 不会自行调用。如果你的密钥没有加载,可能就是这个原因。
  • max_tokens 设置得太低会导致回复在思路中途被截断。如果答案感觉不完整,请调高它。
  • 对话历史需要双方:用户消息 以及 Claude 的回复。缺少任意一方上下文都会中断。
  • 在 macOS/Linux 上,python 可能指向 Python 2。如果出现异常,请使用 python3

接下来

基础已经就绪。它的去向取决于你在构建什么。

  • 工具使用 让 Claude 调用你自己的 Python 函数——在需要它与真实数据或外部服务交互时非常有用。
  • 视觉 让你可以同时发送图像和文本,使 Claude 能读取截图、图表或文档。
  • 异步支持 通过 AsyncAnthropic 实现,如果你一次处理多个请求,值得探索。

完整文档位于 。

十行代码实现全部功能

from dotenv import load_dotenv
from anthropic import Anthropic

load_dotenv()
client = Anthropic()

response = client.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=1024,
    messages=[{"role": "user", "content": "Your message here."}]
)

print(response.content[0].text)
0 浏览
Back to Blog

相关文章

阅读更多 »