使用Python编写的*.py文件可以作为脚本在命令行执行,执行的方式是:python *.py(全路径)<参数可选>

但如果没有对*.py文件(即Python脚本)做一定的处理,虽然也没有报错,但不会有任何结果,还是使用斐波那契数列的例子,如下所示:

 

 执行了 python xxx\FibFunc.py 100以后,没有报错,但也没有打印出任何斐波那契数列数字,这不符合预期!!!

    既然不符合预期,那么咱们就来分析一下原因:从执行结果上看,FibFunc.py中的函数似乎是没有被执行,但调用又是正确的(因为没有报错,暂时任务是正确的),那么是什么原因导致函数没有被调用呢?会不会整个脚本都没有被调用???这就值得期待了!!!

    我们先来给FibFunc.py脚本加上一条打印语句:print(“你好,这是通过命令行调用FibFunc.py”),然后来看看执行效果:

 

 

 

 

 从执行结果看,FibFunc.py确实被调用了,它执行了打印语句,但是没有执行脚本中的函数fib(n),所以,可以锁定它确实是没有调用fib函数。那么我们再添加一行fib(n)的调用看看情况如何

 

 

 

 这时候执行,提示形式参数‘m’没有被定义,换成n会有同样的执行结果!!!所以,在作为python脚本时,函数调用的参数,作为输入应该不能这样写。查阅了一些参考资料,知道这时候的参数‘m’是命令行输入的(即100),接收到的参数会被存放在sys.argv这个列表的第二个位置(即sys.argv[1]),为了验证,我们把它打印出来看看:

 

 

 

 我们把sys.argv的第一个和第二个参数都打印出来,可以发现,第一个参数就是python脚本的全路径,第二个参数就是命令行传入的参数100(经过实验,传入的第二个参数会放在sys.argv的第三个位置,以此类推),那么我们就可以修改一下代码,在调用fib的时候不使用自定义的参数‘m’改为调用sys.argv[1],再实验一下

 

 

 

 在这里,提示了一个“TypError”,说不支持int和str之间的实例转换,这个比较好理解,就是sys.argv[1](或者说sys.argv)是字符串形式的,再修改一下,加个强制转换试试:

 

 至此运行成功!!!这说明,作为python脚本,在命令行中被调用时,需要手动去调用一下fib方法,那么这样修改以后,我们在解释器中能不能正常运行呢?试一下:

 

     答案是否定的,提示sys.argv数组下标超出范围,我们打印出来看看,使用print(len(sys.argv))打印后,发现其长度为1,然后用print(sys.argv[0])打印第一个参数,会看到它的第一个参数就是脚本的全路径。也就是说,使用解释器直接运行的时候,其实默认调用的是类似python *.py的方式,但默认没有传递参数(也可以使用shift+f5执行,加入参数)。显然这个方式定义的模块不够健壮,应该要加一些限制才行!!!根据sys.argv参数的情况,我们可以给他添加一个len(sys.argv)>1的判断,这是行的通的。

    但问题是我们一般情况下不需要引入sys这个库,所以想怎么样才能在需要的时候调用它,在网上查了一些资料,知道作为脚本调用*.py的时候,它的全局变量“__name__”会被赋值为”__main__”,因此,可以通过这个做一些小修改,如下所示:

 

 

 这样就可以在作为脚本的时候引入sys,然后打印斐波那契数列,否则不引入sys库。

 通过这个验证,可以get两个只是点:

1、*.py作为脚本运行时,其全局变量“__name__”会被赋值为“__main__”,如果是作为库导入(即使用import FibFunc),则”__name__”的值为脚本的名称(即FibFunc);

2、*.py作为脚本运行时,其参数应该从sys.argv中提取,而且所有参数均为字符串,需要根据实际情况转换后才能使用。

原文地址:http://www.cnblogs.com/bushLing/p/16889050.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性