2012-12-03 4 views
3

파이썬 스크립트 내에서 라이브러리로 사용할 때 패브릭이 작동하지 않습니다.라이브러리가 작동하지 않는 라이브러리로 사용됩니다.

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


Done. 
Disconnecting from [email protected] done. 

좋아, 지금은, 공장없이 파이썬 스크립트를 실행하는 곳 깰 것 같다 :

#!/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 작업을 실행 :

나는 내 문제를 보여주기 위해 매우 짧은 예를 fabfile.py했다
$ python fabfile.py 
Hello 
[myIp] run: hostname 

즉각적으로 반환되므로 응답을 기다리는 것조차 보이지 않습니다. 어쩌면 오류가있을 수 있지만 출력하는 방법을 알지 못합니다.

이 스킨을 가상 컴퓨터 내에서 실행하고 있습니다. fab은 오류없이 실행되므로이 ​​문제가 있어서는 안됩니다.

UPDATE 스크립트가 처음 run 후 아무것도 실행하지 않는 한 충돌 것으로 보인다

. 다른 한편으로는 local가 작동합니다!

우리는 동료의 랩톱에서 스크립트를 실행했으며 아무런 문제없이 실행됩니다. Ubuntu 10.04에서 Python 2.6.5를 패브릭 1.5.1과 함께 사용하고 있습니다. 그래서이 중 일부에 문제가있는 것 같습니다. 제대로 디버깅 할 수있는 방법이 있습니까? 당신은 팹 명령 보면

답변

1

그것은 다음과 같습니다

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

이는 패브릭 패키지라는 파일 entry_points.txt에서 블록 표시 console_scripts을 찾고 거기에 나열된 방법을 실행 의미, 와

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 
     ) 

:

우리는 우리가 다음 인수를 구문 분석, 흥미로운 fabfile 가져 오기 및 참조이 방법을 살펴 주 :이 경우 fabric.main에 일부 실험은 우리가 같은 것을 가지고 올 수 : 분명히 매우 불완전

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

I의 끝에서

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) 

나는 그것을에서 EOFError 또는 형식 오류를 잡았 때 스크립트가 라인 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 버전의 문제라고 생각합니다.

버전 : 작업에 대한

Python 2.7.3 
Fabric >= 1.5.3 
paramiko 1.10.0 
+0

문제가 해결되었습니다. 나는 어떤 이유에서 Fabric이'paramiko'와는 다른 ssh 라이브러리를 선택했다고 생각합니다. – Christian

+0

paramiko를 제거해야한다는 의미입니까? 또는 직물 옆에 다른 것을 설치 하시겠습니까? – Sgoettschkes

+0

아니요, 단지 파이썬'sys.path'에 다른 ssh 라이브러리가 없기를 바랍니다. – Christian

관련 문제