0

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

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,Traceback(最近一次调用):文件“numpy-array.py”,第 10 行,在 azimuth_cos=sys.argv[2] IndexError: list index out of range

避免该错误的唯一方法是如果我将两个参数都设置为:sys.arg[1]

   #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

如果我将论点放在一行中:

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

错误是:

退出代码:1,Traceback(最近一次调用最后一次):文件“numpy-array-t1.py”,第 10 行,在 azimuth_sin,azimuth_cos = sys.argv[1:2] ValueError:没有足够的值来解包(预期 2 , 得到 1)

我已经尝试了很多方法来解决这个问题,但没有成功,我将不胜感激任何帮助或建议。先感谢您。

4

2 回答 2

0

从简单的事情开始来验证您收到的数据。

执行以下操作:

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 系统上调用函数一样简单地发送信息。

于 2022-01-17T23:16:34.510 回答
0

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

1619:~$ cd mypy
1619:~/mypy$ cat echo.py
import sys
print(sys.argv)

当我这样称呼它时:

1619:~/mypy$ python3 echo.py 1.23 3.112 foo bar
['echo.py', '1.23', '3.112', 'foo', 'bar']

请参阅这sys.argv是来自命令行的 5 个字符串的列表。

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

但是,当从类似Jupyter 笔记本或作为 Jupyter 笔记本argparse运行脚本时,人们在使用 sys.argv (和 )时会遇到问题。pydev我对此一无所知,MQTT server因此甚至无法提供一个命令行参数。正如我所展示的,sys.argv它的主要目的是在从操作系统运行脚本时提供启动值和选项。

于 2022-01-18T00:25:14.257 回答