将数据保存在Python的调用库(pyinvoke)中的上下文变量中

问题描述 投票:2回答:1

使用Invoke library for Python,我想先运行一个设置任务,它会在context variable中保存一些值,以便以下所有任务都可以读取和使用。

然而,The documentation is quite short on that topic说明了这一点

跑步者面临的常见问题是传输或存储当前会话的“全局”值 - 从配置文件(或其他配置向量)加载的值,CLI标志,“设置”任务设置的值等。

(我强调)

,所以这应该是可能的。

但是,当我写这篇文章时,

from invoke import task

@task
def set_context(context):
    context.foo = 'bar'

@task
def read_context(context):
    print(context.foo)

并通过invoke read_context set_context从命令行运行该文件,然后我得到

Traceback (most recent call last):
  File "/usr/local/lib/python3.4/dist-packages/invoke/config.py", line 69, in __getattr__
    return self._get(key)
  File "/usr/local/lib/python3.4/dist-packages/invoke/config.py", line 113, in _get
    value = self.config[key]
  File "/usr/local/lib/python3.4/dist-packages/invoke/config.py", line 110, in __getitem__
    return self._get(key)
  File "/usr/local/lib/python3.4/dist-packages/invoke/config.py", line 113, in _get
    value = self.config[key]
KeyError: 'foo'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/local/bin/invoke", line 11, in <module>
    sys.exit(program.run())
  File "/usr/local/lib/python3.4/dist-packages/invoke/program.py", line 270, in run
    self.execute()
  File "/usr/local/lib/python3.4/dist-packages/invoke/program.py", line 381, in execute
    executor.execute(*self.tasks)
  File "/usr/local/lib/python3.4/dist-packages/invoke/executor.py", line 113, in execute
    result = call.task(*args, **call.kwargs)
  File "/usr/local/lib/python3.4/dist-packages/invoke/tasks.py", line 111, in __call__
    result = self.body(*args, **kwargs)
  File "/home/jenkins/workspace/Deploy_Birmingham_URL_Service_on_Docker_host/deployment/tasks.py", line 14, in read_context
    print(context.foo)
  File "/usr/local/lib/python3.4/dist-packages/invoke/config.py", line 81, in __getattr__
    raise AttributeError(err)
AttributeError: No attribute or config key found for 'foo'

Valid keys: ['run', 'tasks']

Valid real attributes: ['from_data', 'run']

invoke中保存上下文变量并在其他任务中重用它的正确方法是什么?我正在使用Python 3.5.2并调用0.13.0,如果这很重要的话。


未来用户请注意:0.15固定此(github bug link)

python pyinvoke
1个回答
1
投票

使用ctx.update

from invoke import task

@task
def set_context(context):
    context.update({'foo': 'bar'})

@task
def read_context(context):
    print(context.foo) # => 'bar'
© www.soinside.com 2019 - 2024. All rights reserved.