SageMaker聚类模型CLI调用时负数开头数据报错,如何转义负号?
解决AWS CLI调用SageMaker端点时负号开头数据的参数解析问题
这个问题我之前处理过!核心原因是AWS CLI会把以-开头的--body参数内容误认为是新的命令行选项——毕竟CLI默认会把-开头的字符串解析成参数标识,所以才会抛出"argument --body: expected one argument"的错误。下面给你几个实用的解决办法:
方法1:用引号完整包裹数据内容
最直接的方式是用单引号或双引号把你的$mydata变量整个包裹起来,让CLI把整个内容当成一个单一的参数,不会去解析里面的负号:
aws sagemaker-runtime invoke-endpoint --endpoint-name myendpoint --body "$mydata" --content-type text/csv output.json --region eu-west-1
- 如果你的数据里包含双引号,可以用单引号包裹(单引号内的内容不会被shell转义);如果数据里有单引号,就用双引号并转义内部的双引号(比如
\")。
方法2:用文件作为输入(推荐复杂场景)
如果你的数据量较大或者格式复杂,更推荐把数据写入文件,然后通过file://前缀让CLI读取文件内容作为--body的输入:
- 先把数据写入文件:
echo "$mydata" > input_data.csv
- 再调用端点命令:
aws sagemaker-runtime invoke-endpoint --endpoint-name myendpoint --body file://input_data.csv --content-type text/csv output.json --region eu-west-1
这种方法彻底避开了命令行参数解析的坑,还更适合批量数据调用的场景。
方法3:用--终止参数解析
你可以在--body参数前添加--,告诉CLI后面的内容不再是命令行选项:
aws sagemaker-runtime invoke-endpoint --endpoint-name myendpoint -- --body "$mydata" --content-type text/csv output.json --region eu-west-1
不过这种方法偶尔会因为CLI的参数顺序出现兼容问题,所以前两种方法更稳妥。
举个测试例子:如果你的$mydata是"-0.5,2.3,4.1",用方法1的引号包裹后,CLI就能正确识别这是--body的参数内容,不会再报错啦。
内容的提问来源于stack exchange,提问作者Pierluigi Vinciguerra
相关产品推荐
相关产品推荐

