Reputation: 10141
Using the Invoke library for Python, I want to run a setup task first which saves some values in the context variable that all of the following tasks then can read and use.
The documentation is quite short on that topic, however, it states that
A common problem task runners face is transmission or storage of values which are “global” for the current session - values loaded from configuration files (or other configuration vectors), CLI flags, values set by ‘setup’ tasks, etc.
(emphasis by me)
, so that should actually be possible.
However, when I write this,
from invoke import task
@task
def set_context(context):
context.foo = 'bar'
@task
def read_context(context):
print(context.foo)
and run the file from the command line via invoke read_context set_context
, then I get
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']
What is the correct way in invoke
to save something in the context variable and re-use it in other tasks? I am using Python 3.5.2 and invoke 0.13.0 if that's important.
Note to future users: 0.15 fixed this (github bug link)
Upvotes: 2
Views: 1014
Reputation: 1438
Use ctx.update
.
from invoke import task
@task
def set_context(context):
context.update({'foo': 'bar'})
@task
def read_context(context):
print(context.foo) # => 'bar'
Upvotes: 1