首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用sys.argv[1]和numpy数组向Python脚本传递多个参数。IndexError:列出超出范围的索引

使用sys.argv[1]和numpy数组向Python脚本传递多个参数。IndexError:列出超出范围的索引
EN

Stack Overflow用户
提问于 2022-01-17 21:20:51
回答 2查看 723关注 0票数 0

我在一个小代码中工作,接收来自MQTT服务器的多个参数,并使用它们预测另一个值。我在这里展示了一个简化的代码,只是为了得到一些帮助。要将参数传递给执行预测的脚本,第一部分是创建numpy数组,然后使用sys.argv[]将参数传递给脚本,然后通过索引来定位传入的值。

代码语言:javascript
运行
复制
import numpy as np
import sys

    # creating empty numpy array for feature values
X = np.empty(2).reshape(1, 2)

    #storing the arguments
azimuth_sin=sys.argv[1]
azimuth_cos=sys.argv[2]

    #displaying the arguments
print("azimuth_sin : " + azimuth_sin)
print("azimuth_cos : " + azimuth_cos)
print("Number of arguments : ", len(sys.argv))
   
    # set vector values
X[:,0] = sys.argv[1]
X[:,1] = sys.argv[2]

print(X)

但是,当我得到一个错误时,我对第二个参数有一个问题:

退出代码: 1,回溯(最近一次调用):文件"numpy-array.py",第10行,在azimuth_cos=sys.argv2 IndexError:列表索引超出范围

避免此错误的唯一方法是将两个参数设置为:sys.arg1

代码语言:javascript
运行
复制
   #storing the arguments
azimuth_sin=sys.argv[1]
azimuth_cos=sys.argv[1]

   #displaying the arguments
print("azimuth_sin : " + azimuth_sin)
print("azimuth_cos : " + azimuth_cos)
print("Number of arguments : ", len(sys.argv))
   
   # set vector values
X[:,0] = sys.argv[1]
X[:,1] = sys.argv[1]

print(X)

然后我得到两个连续的输出:

azimuth_sin:-0.9152180545267792 azimuth_cos:-0.9152180545267792个参数:2 [-0.91521805 -0.91521805]

以及:

azimuth_sin : 0.40295894662883136 azimuth_cos : 0.40295894662883136论点数:2 [0.40295895 0.40295895]

它们实际上是两个参数的值,但重复了两次:sin = -0.9152180545267792和cos = 0.40295894662883136。

如果我把论点写成一行:

代码语言:javascript
运行
复制
   #storing the arguments
azimuth_sin, azimuth_cos = sys.argv[1:2] 

错误是:

退出代码: 1,回溯(最近一次调用):文件"numpy-array-t1.py",第10行,在azimuth_sin中,azimuth_cos = sys.argv1:2 ValueError:没有足够的值解包(预期的2,得到1)

我已经尝试过很多方法来解决这个问题,但没有成功,我希望得到任何帮助或建议。提前谢谢你。

EN

回答 2

Stack Overflow用户

发布于 2022-01-17 23:16:34

从一些简单的东西开始,以验证您正在接收的数据。

做以下事情:

代码语言:javascript
运行
复制
import sys  
  
# Verify first so you don't get an error  
# This check verifies we have at least two parameters
if 1 < len(sys.argv):
    if sys.argv[1]:
        var_argv1 = sys.argv[1]
        print("var_argv1 type: %s, length: %s" % (type(var_argv1), len(var_argv1)))

        # It is pointless to continue if argv[1] has no data
        if sys.argv[2]:
            var_argv2 = sys.argv[2]
            print("var_argv2 type: %s, length: %s" % (type(var_argv2), len(var_argv2)))
        else:
            print("sys.argv[2] has no data")
    else:
        print("sys.argv[1] has no data")

这可能是因为您试图在命令行中处理numpy对象。

注意:

您可以访问MQTT服务器吗?

选择用于此数据传输的通道(主题)可能更容易。

您可以让MQTT服务器在一个通道上发布这些数据,并让这个脚本订阅该通道。

然后,您可以像MQTT系统上的函数调用一样简单地发送信息。

票数 0
EN

Stack Overflow用户

发布于 2022-01-18 00:25:14

在Linux终端窗口中,我有一个简单的脚本,它只显示sys.argv

代码语言:javascript
运行
复制
1619:~$ cd mypy
1619:~/mypy$ cat echo.py
import sys
print(sys.argv)

当我这样称呼它时:

代码语言:javascript
运行
复制
1619:~/mypy$ python3 echo.py 1.23 3.112 foo bar
['echo.py', '1.23', '3.112', 'foo', 'bar']

请查看sys.argv是来自命令行的5个字符串的列表。

如果要从shell或windows命令窗口调用脚本,则应该能够输入并看到多个字符串。

但是人们在使用sys.argv (和argparse)运行脚本时遇到了问题,比如从pydev或者作为木星笔记本运行脚本。我对MQTT server一无所知,所以不得不提供一个命令行参数。正如我所演示的,sys.argv主要用于在从操作系统运行脚本时提供启动值和选项。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70747657

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档