python *乘号在命令行中为什么报错,python乘号,环境Mac Os X 1


环境

Mac Os X 10.9
python 2.7

实现功能

命令行传入公式,输出结果

出错原因

‘*‘ 号把整个目录下的文件都当作参数传入了

问题

如何正确传入 * 号?

操作

输入公式 ’2 * 3‘:

python calc.py 2 * 3

print sys.argv 的结果

['calc.py', '2', 当前目录下所有文件名如't1_1.py', '3']

返回错误

Traceback (most recent call last):  File "calc.py", line 54, in <module>    main(sys.argv)  File "calc.py", line 51, in main    calc(argv)  File "calc.py", line 16, in calc    bNum = float(bNum)ValueError: could not convert string to float: backup_ver2.py

源码

#!/usr/bin/env python# -*- coding: utf-8 -*-import sysimport osdef calc(argv):    aNum = argv[1]    Opr  = argv[2]    bNum = argv[3]    if '.' in aNum:        aNum = float(aNum)    else:        aNum = int(aNum)    if '.' in bNum:        bNum = float(bNum)    else:        bNum = int(bNum)    Opr = str(Opr)    if Opr == '+': res = aNum + bNum    elif Opr == '-': res = aNum - bNum    elif Opr == '*': res = aNum * bNum    elif Opr == '/': res = aNum / bNum    elif Opr == '%': res = aNum % bNum    elif Opr == '**' or Opr == '^':        res = aNum ** bNum    else:        print "Operator error: '%s'" % Opr    o2f(argv, res)    print resdef showres():    filename = open('calc', 'r')    fileread = filename.readlines()    for eachLine in fileread:        print eachLine,    filename.close()def o2f(argv, res):    filename = open('calc', 'a')    filename.write(argv[1] + argv[2] + argv[3] + '=' + str(res) + os.linesep)    filename.close()def main(argv):    '''useage:    print -- show all the result    example: 1 + 1 -- to get the result'''    if argv[1] == 'print':        showres()    else:        calc(argv)if __name__ == '__main__':    main(sys.argv)

执行

python calc.py 2 "*" 3

就可以了

想绕过转义的话就修改下程序以支持

python calc.py 2 x 3

这样的用法好了

这不是python的问题,而是shell的问题。

例如cat *这个命令---cat的行为很单纯,只是从参数表获取文件列表,之后显示每个文件而已,而根本不会执行“列文件列表”这个自己责任之外的动作。

是shell先识别到了*,认为*是shell的通配符,由shell把*替换成文件列表,从而cat程序收到的只是文件列表。

你可以试试用python的subprocess模块去调用你的calc程序,没有了shell的干扰,保管正确。

所以你需要查一下你的shell下,如何去转义*字符,废掉shell将*视为通配符的行为。

忘了markdown要转义*字符,掉坑了!!!-_-#

编橙之家文章,

评论关闭