2012-12-03 90 views
3

當我在自己的Python腳本中用作庫時,無法使用結構。我做了一個非常簡單的例子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 [email protected] done. 

好了,現在,運行python腳本無晶圓廠似乎打破地方:

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

它立即返回,所以它甚至不等待響應。也許有錯誤,但我不知道如何輸出這些錯誤。

我在我的流浪虛擬機中運行這個腳本。由於fab執行沒有任何錯誤,我猜這應該不成問題!

UPDATE

腳本似乎已崩潰,因爲它沒有第一run後執行的任何東西。另一方面local作品!

我們在同事的筆記本電腦上執行腳本,它運行時沒有任何問題。我在Ubuntu 10.04上使用Python 2.6.5和Fabric 1.5.1,所以我猜這有些問題!有什麼方法可以正確調試嗎?

回答

1

,如果你看一下工廠的命令,它看起來是這樣的:

sys.exit(
    load_entry_point('Fabric==1.4.3', 'console_scripts', 'fab')() 
) 

,這意味着它會在織物包中的文件名爲entry_points.txt塊標記console_scripts並執行那裏列出的方法,在這種情況下fabric.main:主,當我們看這個方法我們可以看到參數解析,有趣fabfile進口,然後

if fabfile: 
    docstring, callables, default = load_fabfile(fabfile) 
    state.commands.update(callables) 
.... 
for name, args, kwargs, arg_hosts, arg_roles, arg_exclude_hosts in commands_to_run: 
    execute(
      name, 
      hosts=arg_hosts, 
      roles=arg_roles, 
      exclude_hosts=arg_exclude_hosts, 
      *args, **kwargs 
     ) 

與一些試驗,我們能拿出這樣的:

from fabric import state 
from fabric.api import * 
from fabric.tasks import execute 
from fabric.network import disconnect_all 

def test(): 
    with settings(host_string='host', user="user", password="password"): 
     print run("hostname") 

if __name__ == '__main__': 
    state.commands.update({'test': test}) 
    execute("test") 

    if state.output.status: 
     print("\nDone.") 
    disconnect_all() 

這顯然是非常不完整的,但也許你只需要在你的腳本

+0

謝謝你的工作!我不認爲需要做很多工作。如上所述,我的腳本在同事的筆記本電腦上運行得很好(他使用Windows7和Python 2.7)。 – Sgoettschkes

+0

文檔中還有關於如何將庫作爲庫使用的章節:http://docs.fabfile.org/en/1.5/usage/library.html – Morgan

2

我的末尾添加

disconnect_all() 

線我們遇到了類似的問題,即fab命令在沒有錯誤的情況下退出,但在第一個命令run()/sudo()命令中只是空白行。

所以我把run()命令到嘗試:除了:塊並打印回溯:

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) 

我看到它的腳本在fabfile/network.py在線路419退出時,它捕捉到一個引發EOFError或類型錯誤。我修改腳本:

... 
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' 

所以我除去襪子關鍵字參數在連接上述方法的幾行和它的工作等的魅力。我想這是一個paramiko版本的問題,它不允許使用sock關鍵字。

版本:

Python 2.7.3 
Fabric >= 1.5.3 
paramiko 1.10.0 
+0

已解決問題。我認爲由於某些原因,Fabric選擇了不同於'paramiko'的ssh庫。 – Christian

+0

這是否意味着我必須卸載paramiko?或者在布料旁邊安裝其他東西? – Sgoettschkes

+0

不,請確保你的python'sys.path'中沒有任何其他的ssh庫。 – Christian