当我的python脚本使用文件进行argparse时;args";我的";如果;车站经过

当我的python脚本使用文件进行argparse时;args";我的";如果;车站经过,python,argparse,Python,Argparse,当我使用--host=192.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&g

当我使用--host=192.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

谢谢你的帮助

首先,您的
hfile
要么是字符串,要么是
None
。这些
都不是真的
。这两者都不是真的

非空字符串是真实的<代码>无不可用。两者都不是非空字符串。因此,如果您想将空字符串(例如,
--host file='
)视为没有参数,只需测试
hfile
的真实性:

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

if hfile is not None:

对于
--host
您没有这个问题的原因很简单:您不需要在任何地方测试
host
,因此没有地方会让测试出错


但是,也许您应该测试主机的
None
。我不确定您在这种情况下到底想做什么,但您肯定不想用
调用
主机的
连接(用户、主机、密码、密码)
。这就是为什么会出现异常,因为库试图将所有这些字符串连接在一起,而其中一个不是字符串


如果它失败了,我希望它使用“child=connects(user,hosts,passwd,en_passwd)”会出错。如果你仔细看,你会发现在我的“If”下我使用connects,and hosts(复数),但它看起来像是在主connect和host下解析文件

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


最后,你的逻辑一开始毫无意义

您将浏览
hosts
文件。对于每一行,您都要选中
hfile
。如果是真的,您将进行单次连接,然后退出。如果它不是truthy,它将永远不会变成
truthy
,因此您也将跳过所有其他行。所以,除了第一行之外,你不可能处理任何一行

此外,在该循环中,您将用每一行替换
主机

另外,您正在剥离
r
而不是
\r
,并且您在剥离之前就已经剥离了
\n
,这意味着即使您做对了,也不会有任何东西可以剥离

最后,您得到了所有在
main
定义之后的顶级代码,并尝试使用
main
的局部变量,甚至从不调用
main
。我怀疑你可能混合了标签和空格,所以最终粘贴在这里的内容与你原来脚本中的内容不匹配;如果是这样的话,如果幸运的话(并且得到
缩进错误
),几乎肯定会导致难以调试的问题,如果不是这样的话(并且只是拥有错误的流控制),则几乎不可能。找到一个文本编辑器,它可以自动将选项卡转换为空格和/或直观地显示选项卡(除了记事本和文本编辑之外,几乎任何东西都可以…),并使用
-tt
标志测试脚本,以防它滑过编辑器


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

错误是由
用户
主机
参数导致的
连接

我看不到您在哪里设置
用户

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


使用
argparse
调试代码时,我经常
打印args
,以确保它按照我的预期解析输入。

一些旁注:您可以对主机中的行执行
。您应该始终
关闭
打开的任何文件
,理想情况下使用
with
语句,而不是手动操作。现在大部分工作正常,谢谢!有一个问题,我得到了一个错误,它说--host\u file“错误:没有这样的选项:--host\u file”。它就在那里,你介意看看我在github上的代码,看看是否有明显的原因导致这个错误吗?再次感谢!谢谢你的帮助,我删掉了很多代码,也许我不该这么做。我来看看你的馅饼盒。这是我的完整代码,如果有帮助的话。
if hfile is not None: