2016-07-11 4 views
1

Я сделал несколько скриптов, которые используют Fabric, он выполняет некоторую работу на нескольких серверах с помощью ssh. Но мои скрипты как классический питон скриптFabric fabfil исполнение модели ArgumentParser

Вот форма (как они выглядят): my_script.py с некоторой функцией и основной:

from fabric.api import * 
from a_custom_class import * 

def function1(): 
    #do stuff 
def function2(): 
    #do stuff 

def main(): 
    parser = ArgumentParser() 
    parser.add_argument('-n', '--nolaunch', help='start the parsing', action='store_false') 
    ... 
    execute(function1) 
    execute(function2) 

if __name__ == "__main__": 
     main() 

Так, чтобы использовать мой сценарий, я просто делаю python my_script.py <my_options_for_ArgumentParser> Это отлично работает. Но я не могу назвать это fab -f my_scrip.py main.

Неправильно ли писать сценарий, как «обычный» сценарий? Или есть способ назвать это fab без повторного использования?

При попытке fab -f my_script.py main выхода это помощь от моего сценария (так что я чувствую, что я близок к чему-то):

usage fab [-h] [-n] [-g] [-m CARTO] 

это мои варианты от scipt. Но это не отображается так же, если я пытаюсь вызвать его «обычным способом» python my_script.py -h:

-h, --help   show this help message and exit 
-n, --nolaunch  start the parsing 
-g, --html   generate the html 
-m CARTO, --carto CARTO Do the carto stuff 

Вызов реальный основной просто список функций из моего сценария fab -f my_script.py __main__ и я могу вызвать любую функцию с: fab -f my_script.py my_function Но Я не могу понять, как задать значение параметра для ArgumentParser. Я пробовал такие вещи, как: fab -f my_script.py main:<myoptions>, но безуспешно.

+0

Это трудно сказать. Ваш код не воспроизводится. Я могу только догадываться, что ткань «съедает» аргументы из командной строки, прежде чем вы получите какой-либо шанс разобрать ее ... – ziky

+0

Извините, я не смог поместить настоящий код, это несколько тысяч строк. Да, я думаю, что это так, Ткань пытается прочитать аргумент, как будто это было для него. Я просто придерживаюсь своего классического вызова 'python my_script.py

+0

Было бы хорошо. Я попытался посмотреть исходный код ткани, и он использует '' OptionParser'' из пакета '' optparse''.Я даже пытался проверить, удаляет ли '' OptionParser'' аргументы, однако после неудачной попытки мне стало скучно и не удалось. Но дайте мне знать, если вы сделали лучше, спасибо. :) – ziky

ответ

0

Я нашел способ. Но это действительно уродливо.

#fabfile.py 
import my_script as script 

def task(): 
    execute(script.mainbis) 

и my_script.py, я в mainbis создающих(), который overide в sys.argv и вызова основной функции:

#my_script.py 
def mainbis(): 
    # ask interactively the option 
    # list_option=['--What', '--the', '--user', '--said'] 
    list_option.insert(0,my_script.py) #we need the script name as 1st argument 
    sys.argv=list_option 
    main() 

Теперь я могу назвать: fab task и кормить вариант после. Вы, ребята, думаете, что это приемлемо?

Кроме того, есть эта env.variable в ткани:

задача по умолчанию: []

Задается ФАБОМ полного перечня задач, которые будут выполняться в настоящее время исполняющей команду. Только для ознакомительных целей.

Может быть, я могу загрузить мой аргумент там, когда я называю fab task --tasks=<my_options> Но еще раз, я чувствую, что это не правильный способ сделать это