2014-05-12 13 views
5

Tôi có một fabfile (fabfile.py) với một số nhiệm vụ tuyên bố:Trong Vải, làm thế nào tôi có thể thực thi các tác vụ từ một tệp python khác?

# fabfile.py 
from fabric.api import * 

@task 
def start(): 
    # code 

@task 
def stop(): 
    # code 

Sau đó, khi tôi cố gắng để gọi bất kỳ của những nhiệm vụ bằng cách sử dụng chức năng thực hiện từ vải như thế này:

# main.py 
from fabric.api import execute 
from fabfile import * # I don't really know if this is necessary 
         # or how should it be done 
def main(): 
    execute('start') 

Nó tăng lỗi này:

Fatal error: None is not callable or a valid task name 

ý định của tôi là làm cho một loại wrapper cho một số nhiệm vụ quy định tại fabfile mà có thể được gọi với đối số khác nhau, và nhiệm vụ thực hiện phải được lấy từ các đối số khi bạn thực hiện cuộc gọi đến chương trình chính này, vì vậy tôi không thể gọi hàm một cách rõ ràng, nhưng sử dụng tên tác vụ.

Điều này sẽ được thực hiện như thế nào? Có lẽ tôi hiểu lầm rằng vải được cho là hoạt động như thế nào?

Cảm ơn bạn

+0

Chạy 'fab -h', nó cung cấp:' -f PATH, --fabfile = PATH'. – WKPlus

+0

Nhưng tôi đang cố gắng sử dụng các tác vụ từ một tập lệnh python khác, không sử dụng công cụ fab: s – Garinoth

Trả lời

7

Thay đổi execute('start')-execute(start).

Tôi không tìm hiểu tại sao vượt qua một taskname để thực hiện không hiệu quả, nhưng có một cách giải quyết:

import fabfile 
execute(getattr(fabfile, 'start')) 

Cập nhật: Sau khi đọc một mã bit và làm một số xét nghiệm của vải, Tôi nghĩ rằng execute('task_name') chỉ có thể được sử dụng khi nhiệm vụ vải được nạp. Theo mặc định, bạn có thể sử dụng nó trong các fabfile.py như thế này:

@task 
def task1(): 
    #do task1 

@task 
def task2(): 
    #do task2 

@task 
def task3(): 
    #do task1 and task2 
    execute('task1') 
    execute('task2') 

Sau đó, bạn có thể sử dụng để thực hiện fab task3task1task2 với nhau. Nhưng cho đến bây giờ, tôi vẫn đang sử dụng vải một công cụ.

Cập nhật lại :-)

Sau đó, tôi đọc một mã chút vải và thấy rằng sử dụng vải như một công cụ sẽ gọi fabric.main.main mà gọi fabric.main.load_fabfile để tải nhiệm vụ từ fabfile.

Vì bạn sử dụng python main.py để chạy tập lệnh, tác vụ fab không được tải ngay cả khi bạn đã nhập fabfile. Vì vậy, tôi thêm một mã chút để bạn main.py:

docstring, callables, default = load_fabfile('fabfile.py') 
state.commands.update(callables) 

Và bây giờ, execute('start') làm việc chính xác như bạn muốn.

+0

Điều đó có hiệu quả, nhưng tôi cần sử dụng tên tác vụ, vì nó sẽ được chuyển làm đối số. Như được chỉ định ở đây: http://docs.fabfile.org/en/latest/api/core/tasks.html#fabric.tasks.execute nó sẽ hoạt động bằng cách sử dụng tên tác vụ – Garinoth

+0

@Garinoth đã cập nhật câu trả lời của tôi. – WKPlus

+0

Vâng, nó hoạt động! Tôi đã quyết định sử dụng tên tác vụ mà tôi không nghĩ đến giải pháp đó. Cảm ơn bạn! – Garinoth

Các vấn đề liên quan