python - 用作库的织物不起作用

标签 python fabric

当在我自己的 python 脚本中用作库时,我无法让 fabric 正常工作。我做了一个非常简短的示例 fabfile.py 来演示我的问题:

#!/usr/bin/env python

from fabric.api import *

print("Hello")

def test():
    with settings(host_string='myIp', user="myUser", password="myPassword"):
        run("hostname")

if __name__ == '__main__':
   test()

运行 fab 就像一个魅力:

$ fab test
Hello
[myIp] run: hostname
[myIp] out: ThisHost
[myIp] out:


Done.
Disconnecting from myUser@myIp... done.

好的,现在,在没有 fab 的情况下运行 python 脚本似乎在某处中断:

$ python fabfile.py
Hello
[myIp] run: hostname

它立即返回,所以它甚至似乎没有等待响应。可能有错误,但我不知道如何输出这些错误。

我正在我的 vagrant 虚拟机中运行这个脚本。由于 fab 执行没有任何错误,我想这应该不是问题!

更新

脚本似乎崩溃了,因为它在第一次运行 后没有执行任何操作。 local 另一方面是可行的!

我们在同事的笔记本电脑上执行脚本,它运行没有任何问题。我在带有 fabric 1.5.1 的 Ubuntu 10.04 上使用 Python 2.6.5,所以我猜其中一些有问题!有什么方法可以正确调试吗?

最佳答案

我遇到过类似的问题,fab 命令退出时没有错误,但在第一个 run()/sudo() 命令上只有一个空行。

所以我将 run() 命令放入 try:except: block 中并打印回溯:

def do_something():
    print(green("Executing on %(host)s as %(user)s" % env))
    try:
        run("uname -a")
    except:
        import traceback
        tb = traceback.format_exc()
        print(tb)

我看到它在捕获到 EOFError 或 TypeError 时在第 419 行的 fabfile/network.py 中退出。我将脚本修改为:

...
except (EOFError, TypeError) as err:
    print err
    # Print a newline (in case user was sitting at prompt)
    print('')
    sys.exit(0)
...

然后打印出来:

connect() got an unexpected keyword argument 'sock'

所以我在上面几行的连接方法中删除了 sock 关键字参数,它的效果很好。我猜这是 paramiko 版本的问题,它不允许使用 sock 关键字。

版本:

Python 2.7.3
Fabric >= 1.5.3
paramiko 1.10.0

关于python - 用作库的织物不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13681341/

相关文章:

python - 使用 fabric 如何为 psql 提供密码?

python - Fabric:本地命令用法

python - 如何使用 Fabric 使用 nohup 启动后台进程?

python - 如何在结构中以并行模式运行一次命令?

python - 将 jpg、gif、png 等存储到 gae-datastore

python - 如何在 wxpython 中的 StaticBitmap 上创建悬停效果?

Python 2.7 值错误 : Need more than 0 vales to unpack (Learn Python the Hard Way Ex 41)

python 格式化一个 float 来打印 .123 而不是 0.123

python - Pyramid :获取应用程序绝对 url

python - 如何正确分发基于 python-fabric 的 python 应用程序