我在一个小代码中工作,接收来自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,回溯(最近一次调用):文件"numpy-array.py",第10行,在azimuth_cos=sys.argv2 IndexError:列表索引超出范围
避免此错误的唯一方法是将两个参数设置为:sys.arg1
#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,回溯(最近一次调用):文件"numpy-array-t1.py",第10行,在azimuth_sin中,azimuth_cos = sys.argv1:2 ValueError:没有足够的值解包(预期的2,得到1)
我已经尝试过很多方法来解决这个问题,但没有成功,我希望得到任何帮助或建议。提前谢谢你。
发布于 2022-01-17 23:16:34
从一些简单的东西开始,以验证您正在接收的数据。
做以下事情:
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-18 00:25:14
在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命令窗口调用脚本,则应该能够输入并看到多个字符串。
但是人们在使用sys.argv (和argparse
)运行脚本时遇到了问题,比如从pydev
或者作为木星笔记本运行脚本。我对MQTT server
一无所知,所以不得不提供一个命令行参数。正如我所演示的,sys.argv
主要用于在从操作系统运行脚本时提供启动值和选项。
https://stackoverflow.com/questions/70747657
复制相似问题