我在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次并停止,对吧?为什么没有?
答案 0 :(得分:12)
num_of_runs = sys.argv[1]
num_of_runs
是该阶段的字符串。
while self.run_number <= self.num_of_runs:
您在这里比较string
和int
。
解决此问题的一种简单方法是将其转换为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,则会抛出错误。