当我的 Python 脚本使用文件进行 argparse "args" 我的 "if" 语句传递



当我使用--host=1192.168.1.1作为参数时,这个脚本就像一个魅力。当我使用--host_file=asa.hosts时,它会失败,因为它似乎与"if hfile is 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=连接(user,主机,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()

非常感谢您的帮助!

首先,您的hfile要么是字符串,要么是None。这两个CCD_ 3。这两者都不是== True

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

if hfile:

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

if hfile is not None:

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


但是,也许您应该None测试host。我不确定在这种情况下你到底想做什么,但你肯定不想用None来调用connect(user, host, passwd, en_passwd)作为host。这就是为什么会出现异常,因为库试图将所有这些字符串连接在一起,而其中一个字符串不是字符串。


如果它失败了,我本以为它会使用"child=connects(user,hosts,passwd,en_passwd)"出错。如果你仔细观察,你会在我的"If"下看到我使用connects和hosts(复数),但它看起来像是在试图解析主连接和主机下的文件。

但是您的if从不触发,所以您在该块中做什么并不重要。另一方面,connect总是运行,所以这就是失败的原因。


最后,您的逻辑从一开始就没有意义。

您将浏览hosts文件。对于每一行,请选中hfile。如果它是真的,你将做一个单一的连接,然后exit。如果它不是真的,它永远不会变成truthy,所以你也会跳过所有其他行。所以,你不可能处理第一行以外的任何一行。

此外,在该循环中,用每一行替换hosts

此外,你正在剥离r而不是r,并且在n之前剥离它,这意味着即使你做对了,也永远不会有任何东西可以剥离。

最后,您得到了main定义之后的所有顶级代码,并尝试使用main的局部变量,甚至从未调用main。我怀疑你可能混合了制表符和空格,所以最后粘贴在这里的内容与你原始脚本中的内容不匹配;如果是这样的话,如果你幸运的话(得到了IndentationError),几乎可以保证会导致难以调试的问题,如果你不幸运的话,几乎不可能(只是流控制错误)。找到一个文本编辑器,它可以自动将选项卡转换为空格和/或以视觉方式显示选项卡(除了Notepad和TextEdit之外,几乎任何东西都可以…),并使用is True0标志测试脚本,以防它滑过编辑器。

不管怎样,也许你想要这样的东西,但我真的只是在猜测。

错误是由userhost参数导致的,connect变为None

我看不出你在哪里设置了user

看起来connecthost自变量来自args.host。如果您没有给它一个--host参数,那么它的值将是默认的None

当使用argparse调试代码时,我经常使用print args来确保它按预期解析输入。

最新更新