Fabric: 'abort_on_prompts'覆盖warn_only = True

创建于 2012-10-22  ·  12评论  ·  资料来源: fabric/fabric

尝试同时使用abort_on_prompts和warn_only = True将使abort_on_prompts覆盖warn_only,并且结构仍然会抛出SystemExit

In [6]: from fabric.api import sudo, execute, cd, env, run, local

In [7]: with settings(warn_only = True):
    result = local("ls -ltrh")
   ...:     
[localhost] local: ls -ltrh
total 188K
In [8]: with settings(warn_only = True):
    result = local("ls -ltrh /tmp/tartratrat")
   ...:     
[localhost] local: ls -ltrh /tmp/tartratrat
ls: cannot access /tmp/tartratrat: No such file or directory

Warning: local() encountered an error (return code 2) while executing 'ls -ltrh /tmp/tartratrat'


In [9]: env['abort_on_prompts'] = True

In [10]: with settings(warn_only = True):
    result = local("ls -ltrh /tmp/tartratrat")
   ....:     
[localhost] local: ls -ltrh /tmp/tartratrat
ls: cannot access /tmp/tartratrat: No such file or directory

Warning: local() encountered an error (return code 2) while executing 'ls -ltrh /tmp/tartratrat'


In [11]: with settings(warn_only = True):
    result = run("ls -ltrh /tmp/tartratrat")
   ....:     

Fatal error: Needed to prompt for the target host connection string, but abort-on-prompts was set to True

Aborting.
An exception has occurred, use %tb to see the full traceback.

SystemExit: 1
To exit: use 'exit', 'quit', or Ctrl-D.
Bug Core

所有12条评论

(提示,请使用文本字段上方的“ Github Flavored Markdown”链接,它将向您展示如何正确设置格式。修正了您的描述:))

我认为在大多数情况下,当用户切换abort_on_prompts ,他们_很可能_期望当前行为(中止),而不是警告并继续。 warn_only=True _

但是,我承认这两种情况都为True的情况并没有得到很好的定义/记录。 此外,代码库中abort()大多数其他用法已被对error()调用所取代,这是处理“如果warn_only=False则中止”逻辑的原因。

现在,我将继续呼吁一致性,这要胜过用户尝试中止提示并被意外的warn_only=True挫败的可能性,并将进行您请求的更改。 如果其他人来抱怨,我还是会把你放在前面;)

反思后,我真的很为难。 如前所述,对于那些确实确实希望Fabric在意外提示下爆炸的用户,我可以看到这一变化使用户不知所措。 隐藏的错误令人难以置信地进行跟踪。

@pkittenis-try/except SystemExit解决该问题?

如果您对此感到困难,那么可能更有意义的是添加一些新的配置选项(可能有一些愚蠢的名称,例如warn_trumps_abort ),以便用例中的人可以控制行为,而不会引起意外的更改对于当前用户。

问题是, abort_on_prompts的行为会导致结构在命令出错时回落到No hosts found. Please specify (single) host string for connection:时,使Fabric抛出SystemExit。

当使用fabric作为API时,这是错误的IMO。 API的用户已经设置了warn_only来避免执行时退出SystemExit,而是能够处理代码中的返回码。 那太棒了。

然后,用户设置abort_on_prompts ,而不是在命令失败时获取命令的错误代码,而是由于回退到enter a host并使用abort_on_prompts而获得了SystemExit。 当然,可以处理该异常,但是在那种情况下,您将无法再看到失败的命令的返回码。

现在可以通过将abort_on_prompts重置

我想最好是使用一个标志来完全禁用内置的结构提示,这些提示是要在命令行上使用的,尤其是在使用结构作为API时使用的No hosts found.. 。 然后abort_on_prompts不会导致SystemExit,因为没有提示导致它退出。

+1-我现在正遇到这个问题。 我的具体用例是,我正在使用Fabric,以便检查最近配置的云节点并确认这些节点是否具有使用适当公钥的SSH访问权限。 结果,我实际上需要_catch_abort_on_prompts异常。 现在,我只是要明确捕获SystemExit,但这确实确实很错误。

+1-我也想捕捉abort_on_prompts异常。

:+1:我处在同样的情况下,我不希望SystemExit -它杀死了我的芹菜工人。

在此阶段,我认为此更改级别更适合2.0版,该版本的设计首先是API用例,而CLI用例是辅助/包装器用例。 更改1.x中的行为将令人惊讶/困惑/容易添加错误。

标记为2.x并保持打开状态,以便我希望可以重新访问并确保在编写API的那部分时考虑到它。

+ warn_onlyabort_on_promptswarn_only都为_True_时,应以warn_only为准。
关于这个问题的另一个话题, @reeesgahttps :

+1

+1-当abort_on_prompts和warn_only都为True时,以warn_only为准。 较新的设置也可以

这事有进一步更新吗 ?
我赶上了SystemExit,但这只会使我的输出变得难看...

自己看看:

webapps2adm001.qa.aws.company.com:以根SUCCESS身份进行连接。
webapps2001.qa.aws.company.com:以根SUCCESS身份进行连接。

致命错误:需要提示输入连接或sudo密码(主机:webapps3001.ia.aws.company.com),但在并行模式下输入将不明确

中止。
webapps3001.ia.aws.company.com:以根FAILED身份连接。 系统退出:1
webapps3adm001.ia.aws.company.com:以根SUCCESS身份进行连接。

我只想中止后再继续排队。 我不想看到错误消息。

我也遇到了这个问题,很乐意看到当前的行为发生了变化。

此页面是否有帮助?
0 / 5 - 0 等级