Python使用sys.argv进行矢量/数组输入

时间:2013-12-17 18:00:19

标签: python

尝试编写我在Python中使用的Matlab脚本。首先,我必须做一个点积,我想测试,以确保它的工作。机械工程师,而不是软件,所以我因缺乏专业知识而受阻。

import operator
def dot( vector1, vector2 ):
    dp = sum(map( operator.mul, vector1, vector2))
    return dp

所以,首先我设置我的功能。然后,我必须调用我的功能,对吧?像这样:

if __name__ == "__main__":
    import sys
    #dp = dot([2,5],[10,2])
    dp = dot(int(sys.argv[1]),int(sys.argv[2]))
    print dp

我试图通过以下方式运行:

python dot.py [1,3] [3,1]

我可以想到int([1,3])无法工作的一系列原因,但我该如何正确编码呢?

在宏伟的计划中,我将在整个计划中做一堆“矢量数学”;我应该将每个向量的值作为单独的实体来处理吗?这将由一群人使用,所以我想尽可能避免下载新的库。

3 个答案:

答案 0 :(得分:2)

我会做%:> my_prog.py 1,3 3,1

然后处理它

vect1 = map(int,sys.argv[1].split(","))
vect2 = map(int,sys.argv[2].split(","))

并且喜欢programmign ... 不要使用eval ..如果你真的想要至少使用ast.literal_eval < / p>

import ast
v1 = ast.literal_eval("[1,3]")

比eval更安全

另一个(比eval好得多)替代方案是json(参见其他答案)

答案 1 :(得分:1)

如果安全不是问题,我会这样做:

dp = dot(eval(sys.argv[1]), eval(eval.argv[2]))

eval只接受任何看起来像python表达式的字符串并返回该表达式的值。

UPD:更好的解决方案

import json

...

dp = dot(json.loads(sys.argv[1]), json.loads(eval.argv[2]))

P.S。仅当您在两个数组之间放置空格时才会起作用,否则sys.argv将包含更多元素。

答案 2 :(得分:0)

使用参数的eval将解决您的问题。这会将参数视为实际的python语句,而不是需要解析为数据类型的字符串。

dp = dot(eval(sys.argv[1]),eval(sys.argv[2]))

这一般不是一个很好的解决方案,因为您将来可能会遇到更多问题。您最好使用JSON数据或其他东西从文件中读取。