basic_consume() got multiple values for keyword argument 'queue'

本文解决了一个在使用Python与RabbitMQ进行消息队列操作时遇到的问题,详细介绍了如何正确地消费消息,并提供了在Docker环境下配置RabbitMQ服务器及Python虚拟环境的步骤。

在看RabbitMQ实战  高效部署分布式消息队列这本书的时候出现的问题。

channel.basic_consume(msg_consumer, queue="hello-queue", consumer_tag="hello-consumer")

改成

channel.basic_consume("hello-queue", msg_consumer, consumer_tag="hello-consumer")

就好了,哎 是源码里面参数的位置变了。

这个是抄自stackoverflow上的回答,虽然也没有什么用。

https://stackoverflow.com/questions/50404273/python-tutorial-code-from-rabbitmq-failing-to-run

 

I can't reproduce your error, but I want to be as concise as possible, when trying to.

At first I set up a rabbitmq server as docker container on my computer, not to pollute my system:

$ docker run -d --hostname localhost --name some-rabbit rabbitmq:3

Then I use inspect to find about the IPAddress my rabbitmq container is running actually:

$ docker inspect some-rabbit --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}'
172.17.0.2

Next I use pipenv to create a virtual environment in python3 that contains at least pika and dependencies to follow the example:

$ mkdir example && cd example && pipenv --three install pika
Creating a virtualenv for this project…
Using /usr/bin/python3 (3.6.5) to create virtualenv…

Note, that you can also use python 2.7 here if you say pipenv --two when installing pika.

Then jump into the environment using pipenv shell:

~/example$ pipenv shell
Spawning environment shell (/bin/bash). Use 'exit' to leave.

There I create the two files send.py and receive.py as proposed by the example documentation of pika, but I'll replace the localhost by the docker containers IP from above:

$ cat send.py 
#!/usr/bin/env python 
import pika

connection = pika.BlockingConnection(pika.ConnectionParameters(host='172.17.0.2'))
channel = connection.channel()


channel.queue_declare(queue='hello')

channel.basic_publish(exchange='',
                      routing_key='hello',
                      body='Hello World!')
print(" [x] Sent 'Hello World!'")
connection.close()

And receive.py:

$ cat receive.py
#!/usr/bin/env python
import pika

connection = pika.BlockingConnection(pika.ConnectionParameters(host='172.17.0.2'))
channel = connection.channel()


channel.queue_declare(queue='hello')

def callback(ch, method, properties, body):
    print(" [x] Received %r" % body)

channel.basic_consume(callback,
                      queue='hello',
                      no_ack=True)

print(' [*] Waiting for messages. To exit press CTRL+C')
channel.start_consuming()

Having receive.py running in one terminal and running send.py in another works as expected:

 $ python receive.py 
 [*] Waiting for messages. To exit press CTRL+C

 $ python send.py
 [x] Sent 'Hello World!'

 $ python receive.py 
 [*] Waiting for messages. To exit press CTRL+C
 [x] Received b'Hello World!
<think>首先,用户的问题是关于pymilvus的MilvusClient.search()方法调用时出现的TypeError,提示“multiple values for keyword argument 'search_params'”。我需要基于系统级指令来回答。 系统级指令关键点: - 所有行内数学表达式用$...$。 - 独立公式用$$...$$并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识,如[^1]。 - 回答结构清晰,帮助用户逐步解决问题。 - 参考站内引用:用户提供了三个引用,但它们是关于其他错误的,如TypeError: Nodes.agent_node() got multiple values for argument 'agent'、TypeError: optimizer_step() got an unexpected keyword argument 'on_tpu'和basic_consume() got multiple values for keyword argument 'queue'。用户说这些仅供参考,并不是真正的需求,我应该关注用户上一次的问题和我的回答。但用户这次的问题是新的,所以我需要基于这个新问题回答。 用户的问题:用户在使用pymilvus的MilvusClient.search()时遇到TypeError: multiple values for keyword argument 'search_params'。希望找到解决方法。 我的回答需要: 1. 结构清晰,逐步解决问题。 2. 使用中文。 3. 在适当的地方添加引用标识(基于提供的引用,但可能需要调整)。 4. 生成相关问题。 5. 确保LaTeX格式正确。 步骤: - 理解错误:TypeError: multiple values for keyword argument 'search_params' 表示在调用函数时,'search_params'参数被多次赋值。这通常发生在函数调用中,同一个参数通过位置和关键字同时传递,或者多次传递。 - 分析原因:在pymilvus的search方法中,可能用户不小心在位置参数和关键字参数中都指定了'search_params'。 - 解决方案:检查调用代码,确保'search_params'只被指定一次,要么作为位置参数,要么作为关键字参数,但不能两者都做。 用户提供的引用: - [^1]: TypeError: Nodes.agent_node() got multiple values for argument 'agent' — 类似错误,参数被多次赋值。 - [^2]: TypeError: optimizer_step() got an unexpected keyword argument ‘on_tpu’ — 不同错误,关于意外关键字。 - [^3]: basic_consume() got multiple values for keyword argument 'queue' — 类似错误,参数'queue'被多次赋值。 这些引用可以自然地融入回答中,作为类比。 回答结构: 1. **解释错误**:简要解释TypeError: multiple values for keyword argument 'search_params'的含义。 2. **常见原因**:描述在Python中这种错误发生的常见场景。 3. **诊断步骤**:指导用户如何检查自己的代码。 4. **解决方案**:提供具体的修改建议。 5. **示例代码**:展示正确的调用方式。 6. **生成相关问题**:在最后添加相关问题。 确保使用中文。 生成相关问题: - 例如:1. 如何避免在Python函数调用中出现参数多次赋值错误?2. pymilvus search方法的最佳实践是什么?3. 还有其他常见的pymilvus错误吗? LaTeX:如果涉及数学,比如解释参数,可以使用行内数学表达式,但在这个上下文中可能不需要复杂的数学。保持简单。 最终回答框架: - 开头:直接回应问题。 - 主体:逐步解释和解决。 - 结尾:相关问题。</think>### 解决 pymilvus MilvusClient.search() 的 TypeError: multiple values for keyword argument 'search_params' 错误 在使用 pymilvus 的 MilvusClient 进行向量搜索时,调用 `search()` 方法时出现 `TypeError: multiple values for keyword argument 'search_params'` 错误,这是一个常见的 Python 参数传递问题。这个错误表示在函数调用中,`search_params` 参数被多次赋值(例如,同时通过位置参数和关键字参数指定),导致冲突。下面我将逐步解释原因、诊断方法和解决方案,确保回答清晰可靠。本文基于 Python 和 pymilvus 的常见错误处理实践[^1]。 #### 1. **错误原因分析** - **核心问题**:在 Python 中,函数调用时每个参数只能被赋值一次。如果 `search_params` 在位置参数和关键字参数中都被指定,就会出现此错误。例如: - 错误调用:`client.search(collection_name, search_params={...}, ..., search_params={...})`,这里 `search_params` 被重复传递。 - 或者,在位置参数中隐含指定了 `search_params`,又在关键字参数中显式指定,造成冲突[^1][^3]。 - **pymilvus 特定背景**:`MilvusClient.search()` 方法的签名通常定义为: ```python def search(collection_name, data, anns_field, ..., search_params=None, ...): # 方法实现 ``` 如果用户在调用时不小心将 `search_params` 作为位置参数传递(例如,在参数顺序中它对应某个位置),同时又用关键字参数 `search_params=...` 指定,就会触发此错误。类似错误在其他库中也常见,如 RabbitMQ 的 `basic_consume()` 方法[^3]。 #### 2. **诊断步骤** 请检查您的调用代码,逐步排查以下点: - **步骤 1: 检查参数传递方式** 确保 `search_params` 只被赋值一次: - 如果使用关键字参数(推荐),确保没有在其他位置(如位置参数列表)间接指定它。 - 如果使用位置参数,确保参数顺序与函数定义一致,且不额外添加关键字参数。 - **步骤 2: 验证参数顺序** 参考 pymilvus 官方文档(如 [pymilvus 文档](https://milvus.io/docs/search.md)),`search()` 方法的典型参数顺序是: ``` search(collection_name, data, anns_field, search_params, ...) ``` 如果您的调用中 `search_params` 出现在位置参数中(如第三个位置),同时又用 `search_params=` 关键字指定,就会冲突。例如: ```python # 错误示例:search_params 在位置参数中隐含指定,又在关键字中显式指定 results = client.search("my_collection", vectors, "vector_field", {"nprobe": 10}, ..., search_params={"metric_type": "L2"}) ``` 这里,第四个位置参数 `{"nprobe": 10}` 对应 `search_params`,但后面的 `search_params={...}` 又重复赋值,导致错误。 - **步骤 3: 检查参数名拼写** 确保没有拼写错误,如 `search_params` 误写为 `search_param` 或 `params`,这可能导致 Python 解释器将额外参数视为无效输入,间接引发冲突[^2]。 #### 3. **解决方案** 基于诊断,修改调用代码以确保 `search_params` 只赋值一次: - **方案 1: 统一使用关键字参数(推荐)** 显式指定所有参数,避免位置参数歧义。例如: ```python # 正确调用:search_params 只通过关键字指定一次 results = client.search( collection_name="my_collection", data=vectors, # 向量数据 anns_field="vector_field", # 向量字段名 search_params={"metric_type": "L2", "nprobe": 10}, # 搜索参数,只指定一次 limit=10 # 其他参数 ) ``` 这种方式可读性强,且能避免位置错误。 - **方案 2: 统一使用位置参数** 如果坚持用位置参数,确保参数顺序严格匹配函数定义,且不额外添加关键字参数: ```python # 正确调用:search_params 作为位置参数传递,无关键字重复 results = client.search("my_collection", vectors, "vector_field", {"metric_type": "L2", "nprobe": 10}, 10) ``` 注意:这里的第四个位置对应 `search_params`,第五个对应 `limit`。务必查阅文档确认顺序。 - **方案 3: 更新 pymilvus 版本** 如果问题依旧,检查 pymilvus 版本。旧版本可能有参数处理 bug。升级到最新版(如 `pymilvus>=2.3.0`): ```bash pip install --upgrade pymilvus ``` 类似错误在 PyTorch Lightning 中曾通过版本更新解决[^2]。 #### 4. **预防措施** - **代码审查**:在团队协作中,使用 linter 工具(如 PyLint)检查参数传递。 - **单元测试**:添加测试用例模拟调用,捕获类似错误: ```python import unittest from pymilvus import MilvusClient class TestSearch(unittest.TestCase): def test_search_params(self): client = MilvusClient(uri="http://localhost:19530") try: results = client.search(collection_name="test", data=[[0.1, 0.2]], anns_field="vec", search_params={"nprobe": 10}) self.assertIsNotNone(results) except TypeError as e: self.fail(f"TypeError occurred: {e}") ``` - **参考文档**:详细参数说明见 [pymilvus search API 文档](https://milvus.io/api-reference/pymilvus/v2.3.x/Client/search.md)。 如果以上步骤仍无法解决,请提供您的调用代码片段,我可以进一步分析。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天马行空波

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值