invoke.context.Context由于缺少位置参数而给出了一个奇怪的错误

时间:2019-05-08 21:10:01

标签: python python-3.x invoke fabric contextmanager

我正在尝试在上下文管理器中的python程序中更改目录。使用invoke.context.Context似乎是正确的方法,该方法是从Fabric文档中获得的,并且无法使用常规的with os.chdir

但是,当我尝试执行

之类的操作时
from invoke import Context

with Context.cd("/etc"):
    subprocess.run(["ls"])

我收到一条错误消息:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-2-40b28af3213a> in <module>
----> 1 with Context.cd("/etc"):
      2     subprocess.run(["ls"])
      3

~/miniconda3/envs/python3/lib/python3.7/contextlib.py in helper(*args, **kwds)
    237     @wraps(func)
    238     def helper(*args, **kwds):
--> 239         return _GeneratorContextManager(func, args, kwds)
    240     return helper
    241

~/miniconda3/envs/python3/lib/python3.7/contextlib.py in __init__(self, func, args, kwds)
     80
     81     def __init__(self, func, args, kwds):
---> 82         self.gen = func(*args, **kwds)
     83         self.func, self.args, self.kwds = func, args, kwds
     84         # Issue 19330: ensure context manager instances have good docstrings

TypeError: cd() missing 1 required positional argument: 'path'

文档使这看起来是正确的(http://docs.pyinvoke.org/en/latest/api/context.html#invoke.context.Context),但我有点迷茫。

任何建议都是有帮助的。

1 个答案:

答案 0 :(得分:3)

看文档,似乎您应该创建自己的Context实例,而不是直接使用Context类。

他们还在Context实例上使用run()方法,而不是subprocess.run()

尝试一下:

from invoke import Context

c = Context()
with c.cd("/etc"):
    c.run("ls")