python 命令行参数传入 乘号(*) 时出错

环境

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 sys
import os

def 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 res

def 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)
阅读 6.6k
2 个回答

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

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

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

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

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

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

执行

python calc.py 2 "*" 3

就可以了

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

python calc.py 2 x 3

这样的用法好了

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
101 新手上路
子站问答
访问
宣传栏