【发布时间】:2014-07-04 01:49:54
【问题描述】:
我正在使用 Python 使用 scp 自动从网络传感器复制二进制文件。我想添加一些错误检查,但我不知道如何可靠地检查 SSH 是否引发错误,例如主机名解析错误。我目前正在使用 .communicate() 来收集标准输出,然后在错误消息中匹配“ssh”。我检查 err 是否以“ssh”开头的原因是因为如果没有引发错误,则该 err 变量包含它正在登录的传感器的横幅,所以我真的没有办法可靠地检查是否 err 实际上有没有价值(如果有道理的话)。如果找不到文件或抛出其他错误,我也会检查错误代码。有没有更好的方法?
这是当前工作的代码:
sp = Popen(['scp', '@'.join([self.user, self.sensor]) + ':{0}{1}'.format(self.binPath, self.binName), self.storePath], stdout = PIPE, stderr = PIPE)
data, error = sp.communicate()
if error.startswith("ssh"):
print("ERROR: {}".format(error))
else:
if sp.returncode == 1:
print("ERROR: {} - No such file or directory".format(self.binPath + self.binName))
elif sp.returncode == 0:
self.hashCMP(self.storePath, self.binName, md5Sum)
else:
pass
【问题讨论】:
-
sp.returncode == 0表示成功,sp.returncode > 0表示失败,无论error值如何。将其移出else块 -
无关:
"{user}@{sensor}:{binPath}{binName}".format(**vars(self)) -
谢谢。我注意到如果我有一个 SSH 无法解析的主机名,它会在返回码检查之外失败,这就是为什么我让它解析
error而不是只检查返回码。另外,对于您的第二个“不相关”帖子,您是否建议我将 Popen 结构更改为那个? -
“在返回码之外失败”是什么意思?你的意思是
scp以sp.returncode == 0退出并且如果self.sensor是未知主机名则什么都不做?在我的机器上scp在这种情况下返回sp.returncode == 1。''.format的例子表明它是可以做到的:一切都在一个地方,名称是可读的。是否使用它取决于你(例如,vars(self)对类属性失败) -
感谢您的帮助,我让它正常工作。我注意到您对
"{user}@{sensor}:{binPath}{binName}".format(**vars(self))"的建议对我不起作用,它一直报告找不到文件或目录。这是对我有用的命令:Popen(["scp", "{user}@{sensor}:{binPath}{binName}".format(**vars(self)), "{storePath}".format(**vars(self))])。我还必须使用.communicate()来获取returncode,否则它会一直报告None,因为进程不会终止。我试过.wait(),但它报告一个int对象没有属性returncode。
标签: python error-handling subprocess scp