当我的python脚本使用一个文件作为argparse“args”my“if”语句被传递时

2024-09-28 23:30:20 发布

您现在位置:Python中文网/ 问答频道 /正文

当我使用--host=192.168.1.1作为参数时,这个脚本就像一个符咒。使用--host_文件时=东道主,它失败,因为它似乎与“如果hfile为真:”不匹配。所以这显然是错误的。什么是更好的术语来匹配我的--host_文件=名称.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=connects(user,hosts,passwd,en_passwd”时出错 如果你仔细看,你会发现在我的“If”下我使用connects,和hosts(复数),但它看起来像是在试图解析main connect和host下的文件。在

^{pr2}$

非常感谢您的帮助!在


Tags: 文件inpyhostmainconnect错误line
2条回答

首先,您的hfile要么是一个字符串,要么是None。这两个都不是is True。它们都不是偶数。在

非空弦是真理。^{cd2>不是。两者都不是非空字符串。因此,如果您想将空字符串(例如, host-file='')视为无参数,只需测试hfile的真实性:

if hfile:

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

^{pr2}$

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


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


If it was failing, I would have expected it to error using "child = connects(user, hosts, passwd, en_passwd)" If you look close, youll see that under my "if" I use connects, and hosts (plural), but it looks like its trying to parse the file under the main connect, and host.

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


最后,你的逻辑一开始就没有意义了。在

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

另外,在这个循环中,您将hosts替换为每一行。在

另外,你正在剥离r而不是\r,而且你在\n之前剥离了它,这意味着即使你做得对,也不会有任何东西需要剥离。在

最后,您得到了main定义之后的所有顶层代码,并尝试使用main的局部变量,甚至从不调用main。我怀疑您可能混合了制表符和空格,所以最后粘贴到这里的内容与您在原始脚本中的不匹配;如果是这样的话,几乎可以肯定的是,如果您幸运的话(并得到了一个IndentationError)很难调试的问题,如果您没有(只是有错误的流控制),则几乎不可能。找到一个文本编辑器,它可以自动将标签页转换成空格和/或直观地显示标签页(除了记事本和TextEdit几乎可以做任何事情…),并使用-tt标志测试脚本,以防它滑过编辑器。在

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

错误是由userhost参数导致的connectNone。在

我看不到您在哪里设置user。在

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

当使用argparse调试代码时,我经常print args只是为了确保它像我预期的那样解析输入。在

相关问题 更多 >