环境
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)
这不是python的问题,而是shell的问题。
例如cat *这个命令---cat的行为很单纯,只是从参数表获取文件列表,之后显示每个文件而已,而根本不会执行“列文件列表”这个自己责任之外的动作。
是shell先识别到了*,认为*是shell的通配符,由shell把*替换成文件列表,从而cat程序收到的只是文件列表。
你可以试试用python的subprocess模块去调用你的calc程序,没有了shell的干扰,保管正确。
所以你需要查一下你的shell下,如何去转义*字符,废掉shell将*视为通配符的行为。
忘了markdown要转义*字符,掉坑了!!!-_-#