Roberto Aloi
Roberto Aloi

Reputation: 30995

How to set the working directory for a Fabric task?

Assuming I define a trivial task to list files on a remote server:

from fabric.api import run, env

env.use_ssh_config = True

def list_files():
    run('ls')

And I execute it with:

fab -H server list_files

How can I specify the working directory for the command I'm running, other than doing:

run('cd /tmp && ls')

Which doesn't look very idiomatic to me?

Disclaimer: I'm looking at Fabric for the first time in my life and I'm totally new to Python.

Upvotes: 28

Views: 20129

Answers (2)

Roman
Roman

Reputation: 883

Answer for fabric 2.4.0 looks like this:

from fabric import Connection

conn = Connection(host=HOST_NAME, user=USER_NAME, connect_kwargs={'password': PASSWORD})

with conn.cd('/tmp/'):
    conn.run('ls -la')

This is not covered by the fabric documentation but by the invoke documentation.

Upvotes: 24

Daniel Hepper
Daniel Hepper

Reputation: 29957

Use the Context Manager cd:

from fabric.api import run, env
from fabric.context_managers import cd

env.use_ssh_config = True

def list_files():
    with cd('/tmp'):
        run('ls')

Upvotes: 49

Related Questions