当我的python脚本使用文件进行argparse“args”时,我的“if”语句被传递

时间:2014-01-13 23:43:16

标签: python argparse

当我使用--host = 192.168.1.1作为参数时,此脚本就像一个魅力。当我使用--host_file = asa.hosts时,它会失败,因为它似乎与“if hfile为True:”不匹配。所以这显然是错误的。什么是匹配我的--host_file = NAME.TXT

的更好的术语

这是我的错误

Traceback (most recent call last):
 File "asaos-snmpv3-tool-hostfile.py", line 147, in <module>
  main()
   File "asaos-snmpv3-tool-hostfile.py", line 138, in main
   child = connect(user, host, passwd, en_passwd)
   File "asaos-snmpv3-tool-hostfile.py", line 47, in connect
   constr = 'ssh ' + user + '@' + host
  TypeError: cannot concatenate 'str' and 'NoneType' objects

如果失败,我会指望使用“child = 连接(用户,主机,passwd,en_passwd)时出错” 如果你仔细观察,你会发现在我的“if”下我使用连接主机(复数),但看起来它试图解析主文件下的文件连接和主机。

def connect(user, host, passwd, en_passwd):
  ...output cut short

def connects(user, hosts, passwd, en_passwd):
  ...output cut short

def main():
  parser = argparse.ArgumentParser('usage %prog ' + '--host --host_file --username --password  --enable --group --snmp_user --snmp_host --int_name --snmp_v3_auth --snmp_v3_hmac --snmp_v3_priv --snmp_v3_encr')
  parser.add_argument('--host', dest='host', type=str, help='specify a target host')
  parser.add_argument('--host_file', dest='hfile', type=str, help='specify a target host file')

host = args.host
hfile = args.hfile
hosts = open(hfile, 'r')

for line in hosts.readlines():

    if hfile is True:
        hosts = line.strip('r').strip('\n')
        child = connects(user, hosts, passwd, en_passwd)
        send_command(child, SNMPGROUPCMD + group + V3PRIVCMD)
        send_command(child, SNMPSRVUSRCMD + snmpuser + ' ' + group + V3AUTHCMD + SHAHMACCMD + snmpauth + PRIVCMD + snmpencrypt + ' ' + snmppriv)
        send_command(child, SNMPSRVHOSTCMD + intname + ' ' + snmphost + VERSION3CMD + snmpuser)
        send_command(child, SNMPSRVENTRAP)
        send_command(child, WRME)
        exit()
child = connect(user, host, passwd, en_passwd)
send_command(child, SNMPGROUPCMD + group + V3PRIVCMD)
send_command(child, SNMPSRVUSRCMD + snmpuser + ' ' + group + V3AUTHCMD + SHAHMACCMD + snmpauth + PRIVCMD + snmpencrypt + ' ' + snmppriv)
send_command(child, SNMPSRVHOSTCMD + intname + ' ' + snmphost + VERSION3CMD + snmpuser)
send_command(child, SNMPSRVENTRAP)
send_command(child, WRME)
exit()

非常感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

首先,您的hfile要么是字符串,要么是None。这些都不是is True。这些都不是== True

非空字符串是真的。 None不是。两者都不是非空字符串。因此,如果您想将空字符串(例如--host-file='')视为与无参数相同,则只需测试hfile的真实性:

if hfile:

另一方面,如果您想将空字符串视为有效参数,请测试None - ness:

if hfile is not None:

--host没有这个问题的原因很简单:你没有在任何地方测试host,所以没有地方可以测试错误。


但是,也许应该host测试None。在这种情况下,我不确定你真正想做什么,但你绝对不希望connect(user, host, passwd, en_passwd)Nonehost。这就是你得到异常的原因,因为库试图将所有这些字符串连接在一起,其中一个字符串不是字符串。


  

如果它失败了,我会用“child = connected(user,hosts,passwd,en_passwd)”来预期它会出错。如果你仔细观察,你会看到我在“if”下使用连接和主机(复数),但看起来它试图解析主连接和主机下的文件。

但是你的if永远不会触发,所以你在那个街区做什么并不重要。另一方面,connect 始终运行,因此失败了。


最后,你的逻辑首先没有任何意义。

您浏览hosts文件。对于每一行,请检查hfile。如果它真的很简单,你将进行一次连接,然后exit。如果它不是真的,它永远不会变成truthy,所以你也会跳过所有其他行。所以,你无法处理超越第一行的任何行。

此外,在该循环内,您将每行替换为hosts

此外,您正在剥离r而不是\r,并且您在 \n之前剥离,这意味着永远不会有任何内容即使你做对了也要剥离。

最后,您已经获得main定义之后的所有顶级代码,并尝试使用main的局部变量,甚至从不调用main 。我怀疑你可能正在混合制表符和空格,所以最终粘贴在这里的内容与原始脚本中的内容不符;如果是这样的话,几乎可以肯定会导致难以调试的问题,如果你很幸运(并得到一个IndentationError)而且几乎不可能,如果你不是(并且只是有错误的流量控制)。找到一个文本编辑器,可以自动将标签转换为空格和/或直观地显示标签(几乎除了Notepad和TextEdit之外的所有内容......),并使用-tt标志测试您的脚本,以防它滑过编辑器。< / p>

无论如何,也许你想要像this这样的东西,但我真的只是在这里猜测。

答案 1 :(得分:0)

错误导致user的{​​{1}}或host个参数为connect

我看不到您设置None的位置。

user的{​​{1}}参数似乎来自host。如果您没有给它connect参数,则该值将是默认值args.host

使用--host调试代码时,我经常None只是为了确保它按照我的预期解析输入。