检查来自CMD的参数是否已使用Python编写

时间:2017-11-21 12:04:49

标签: python

我是python中的新手,我正在尝试构建一个脚本,该脚本将URL作为参数获取并向网站发送GET请求,然后从响应和HTML正文中打印详细信息。

我写的代码:

import sys
import urllib.request

url = 'https://%s' % (sys.argv[1])
res = urllib.request.urlopen(url)
print('Response from the server:'+'\n', res.info())
print('HTML web page:'+'\n', res.read())

现在,我想检查一个参数是否通过CMD传递,如果没有通过它发出警报。 并且还要打印状态代码和原因。 什么是理性意味着什么? 这是我到目前为止所得到的,我不明白为什么我没有得到任何结果。

我目前的代码是:

import sys
import urllib.request, urllib.error

try:
    url = 'https://%s' % (sys.argv[1])
    res = urllib.request.urlopen(url)
except IndexError:
    if len(sys.argv) < 1:
        print(res.getcode())
        print(res.getreason())
    elif len(sys.argv) > 1:
        print('Response from the server:'+'\n', res.info())
        print('HTML web page:'+'\n', res.read())
        print('Status Code:', res.getcode())

谢谢。

2 个答案:

答案 0 :(得分:1)

只有当你在命令行中没有给出任何参数时,才会执行except块。仅在引发IndexError异常时才会执行。我相信只需打印错误消息就足够了。打印语句应在try块内处理。

import sys
import urllib
from urllib2 import URLError

try:
    url = 'https://%s' % (sys.argv[1])
    #url = r'https://www.google.com'
    res = urllib.urlopen(url)
    print('Response from the server:' + '\n', res.info())
    print('HTML web page:' + '\n', res.read())
    print('Status Code:', res.getcode())
except IndexError as e:
    print e.message
except URLError as e1:
    print e1.reason

注意:我使用的是python 2.7。所以我没有使用urllib.request.urlopen(),因为这在python 2.x中不是必需的

答案 1 :(得分:1)

您只检查len(sys.argv) < 1 or len(sys.argv) > 1是否len(sys.argv) == 1,如果您在没有任何参数的情况下运行脚本将会是sys.argv[0],因为except IndexError是脚本的名称。< / p>

此外,如果你使用if-elif,你实际上是处理(或应该处理)异常,所以python退出时没有错误而没有在import sys import urllib try: url = 'https://%s' % (sys.argv[1]) res = urllib.request.urlopen(url) except IndexError: if len(sys.argv) <= 1: print("Too few arguments") raise # <- or replace with sys.exit(1) if you don't want to propagate the exception 子句中出现任何情况。

你可以这样做:

urllib.request.urlopen(url)

实际的try-except可能会抛出其他异常。我会小心处理与http请求相同的 public void Do() { foreach (var annotation in _annotations) _annotationManager.Remove(annotation); } 块中的命令行参数。