0

ファブリックでは、cdコンテキスト マネージャーは次のように機能します。

with cd("dir"):
    run("command")

dirコマンドは、ディレクトリに変更した後に実行されます。これは正常に機能しますが、問題はグローバル状態を使用することです。たとえば、cd を使用する必要があるヘルパー関数があるとします。

def helper():
    with cd("foo"):
        run("some command")

helper次のような別の関数から呼び出すと

def main_function():
    helper()
    ...

それは正常に動作します。しかし、私が次のようなことをすると

def main_function():
    with cd("bar"):
        helper()

run("come command")from ヘルパーがbar/fooただの代わりにfrom から実行されるようになったため、壊れfooます。

これを回避する方法に関するヒントはありますか?CDで絶対パスを使用しようとしましたが、うまくいきませんでした。私が本当に欲しいのは、cdコンテキストが関数スコープにのみ拡張されることです。

4

1 に答える 1

0

したがって、明らかに絶対パス機能します。問題は、パスが~機能しないことです (それらは相対パスのように扱われますが、これはファブリックのバグです)、それが私が試みていたことです。したがって、する必要があります (たとえば、vagrant を使用している場合) cd('/home/vagrant/foo')

おそらく、ネストされたコンテキストマネージャーで相対パスを回避できます

def func():
    with cd("/home/vagrant/foo"):
        stuff()
        with cd("bar"): # cd /home/vagrant/foo/bar
            more_stuff()

を呼び出すと、現在の作業ディレクトリが正確にわかりますcd('bar')。ただし、最上位cdの s の場合、関数が別の関数内から (から直接ではなくfab) 呼び出されることがある場合は、絶対パスを使用する必要があります。

于 2013-07-06T18:27:50.310 に答える