【发布时间】:2014-03-03 16:46:32
【问题描述】:
我无法弄清楚如何将参数实际传递给结构自定义任务。
我有一堆任务都需要进行相同的设置,所以我希望将任务子类化并让基类进行设置,然后运行特定的子任务。设置代码和子任务都需要访问从命令行传递给任务的一些参数。我还需要能够为参数设置默认值。
最初的尝试
我最初的尝试显示了我在没有任何子类的情况下尝试做的事情。 此代码工作正常。 下面的代码在文件 tmp1.py 中:
from fabric.api import task
def do_setup(myarg):
''' common setup for all tasks '''
print "in do_setup(myarg=%s)" % myarg
# do setup using myarg for something important
@task
def actual_task1(myarg='default_value', alias='at'):
print "In actual_task1(myarg=%s)" % myarg
do_setup(myarg)
# do rest of work ...
@task
def actual_task2(myarg='default_value', alias='at'):
print "In actual_task2(myarg=%s)" % myarg
do_setup(myarg)
# do rest of work ...
我在没有任何参数的情况下从命令行运行它,并且正确地看到了 myarg 的默认值 'default_value'
fab -f ./tmp1.py actual_task1
打印:
In actual_task1(myarg=default_value)
in do_setup(myarg=default_value)
Done.
然后我用 myarg='hello' 调用它,看到 'hello' 被正确传递了
fab -f ./tmp1.py actual_task1:myarg='hello'
它输出:
In actual_task1(myarg=hello)
in do_setup(myarg=hello)
Done.
尝试自定义任务
我的下一个尝试是做一个通用任务来封装设置部分。 这是从http://docs.fabfile.org/en/1.5/usage/tasks.html复制的 下面的代码在文件 tmp2.py 中:
from fabric.api import task
from fabric.tasks import Task
def do_setup(myarg):
''' common setup for all tasks '''
print "in do_setup(myarg=%s)" % myarg
# do setup using myarg for something important
'''
Attempt to make a common task to encapsulate the setup part
copied from http://docs.fabfile.org/en/1.5/usage/tasks.html
'''
class CustomTask(Task):
def init(self, func, myarg, args, *kwargs):
super(CustomTask, self).init(args, *kwargs)
print("=> init(myarg=%s, args=%s, kwargs=%s" % (myarg, args, kwargs))
self.func = func
self.myarg = myarg
print "in init: self.func=",self.func,"self.myarg=",self.myarg
def run(self, *args, **kwargs):
return self.func(self.myarg, *args, **kwargs)
@task(task_class=CustomTask, myarg='default_value', alias='at')
def actual_task1():
print "In actual_task1(myarg=%s)" % myarg
# do rest of work ...
运行时有2个问题:
__init__ 获取“default_value”而不是“Hello”
它抱怨 actual_task1() 需要 0 个参数
我是这样运行的:
fab -f ./tmp2.py actual_task1:myarg="Hello"
打印:
=> init(myarg=default_value, args=(), kwargs={'alias': 'at'}
in init: self.func= self.myarg= default_value
Traceback (most recent call last):
File "/home/xxx/Documents/pyenvs/xxx/local/lib/python2.7/site-packages/fabric/main.py", line 743, in main args, *kwargs
File "/home/xxx/Documents/pyenvs/xxx/local/lib/python2.7/site-packages/fabric/tasks.py", line 405, in execute results[''] = task.run(args, *new_kwargs)
File "/home/xxx/test_fab/tmp2.py", line 21, in run
return self.func(self.myarg, args, *kwargs)
TypeError: actual_task1() takes no arguments (1 given)
我花了很多时间试图完成这项工作,但我似乎无法解决 default_value 问题。我肯定错过了什么?
如果您能帮我弄清楚如何运行这个示例程序,我将不胜感激。具有自定义任务的第二个版本需要像我展示的原始版本一样运行。
感谢您对此问题的任何帮助。
【问题讨论】:
标签: python task subclass fabric