虽然循环没有停止

时间:2015-04-30 14:39:37

标签: python

我在Python中有这个简单的代码:

import sys

class Crawler(object):

  def __init__(self, num_of_runs):
    self.run_number = 1
    self.num_of_runs = num_of_runs

  def single_run(self):
    #do stuff
    pass

  def run(self):
    while self.run_number <= self.num_of_runs:
      self.single_run()
      print self.run_number
      self.run_number += 1

if __name__ == "__main__":
  num_of_runs = sys.argv[1]
  crawler = Crawler(num_of_runs)
  crawler.run()

然后,我这样运行:

python path/crawler.py 10

根据我的理解,它应循环10次并停止,对吧?为什么没有?

2 个答案:

答案 0 :(得分:12)

num_of_runs = sys.argv[1]

num_of_runs是该阶段的字符串。

while self.run_number <= self.num_of_runs:

您在这里比较stringint

解决此问题的一种简单方法是将其转换为int

num_of_runs = int(sysargv[1])

另一种解决方法是使用argparser

import argparse

parser = argparse.ArgumentParser(description='The program does bla and bla')
parser.add_argument(
    'my_int',
    type=int,
    help='an integer for the script'
)

args = parser.parse_args()
print args.my_int
print type(args.my_int)

现在,如果你执行这样的脚本:

./my_script.py 20

输出结果为:

  

20   

默认情况下,使用argparser也会为您提供-h选项:

python my_script.py -h
usage: i.py [-h] my_int

The program does bla and bla

positional arguments:
  my_int      an integer for the script

optional arguments:
  -h, --help  show this help message and exit

有关详细信息,请查看argparser文档。

注意:我使用的代码来自argparser文档,但稍作修改。

答案 1 :(得分:3)

当从命令行接受输入时,数据作为字符串传递。在将此值传递给int类之前,您需要将此值转换为Crawler

num_of_runs = int(sys.argv[1])

您还可以利用它来确定输入是否有效。如果它没有转换为int,则会抛出错误。