2013-07-06 6 views
0

에서 CD() 처리는 cd 컨텍스트 매니저는패브릭 : 도우미 기능 직물에서

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

처럼 작동하고 명령은 dir 디렉토리로 변경 한 후 실행됩니다. 이 잘 작동하지만 문제는 전역 상태를 사용하는 것입니다. 내가

def main_function(): 
    helper() 
    ... 

잘 작동과 같은 다른 함수에서 helper를 호출하면

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

예를 들어, 내가 CD를 사용해야하는 도우미 함수를 가지고 가정합니다. 내가

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

이 중단 그런 짓을한다면 도우미에서 run("come command") 지금 bar/foo 대신 단지 foo에서 실행되기 때문이다.

이 문제를 해결하는 방법에 대한 유용한 정보가 있습니까? 나는 CD에서 절대 경로를 사용하여 시도했지만, 작동하지 않았다. 실제로 원하는 것은 cd 컨텍스트를 함수 범위로만 확장하는 것입니다.

+1

'cd '가 전역 상태를 사용한다고 말하는 것은 약간 잘못된 것입니다. 그것은 어쨌든 전역 상태 인 작업 디렉토리를 수정하고, 예기치 않은'cd'는 작업 디렉토리에 의존하는 명령들이 깨뜨릴 수있는 몇 가지 방법 중 하나 일뿐입니다. 이 문제를 해결하려면 절대 경로를 사용하십시오. – delnan

+0

그래, 무슨 일이 있었는지 알 겠어. 절대 경로가 작동하지 않는다고 생각했지만 내 경로는 완전히 절대적이지 않았습니다. 그들은 그들 안에'~'을 가지고있었습니다. 예비 테스트는 절대 경로가 실제로 절대 경로 일 경우 실제로 작동 함을 나타냅니다. – asmeurer

+0

이것은 아마도 직물의 버그로 간주되어야합니까? – asmeurer

답변

0

분명히 절대 경로 입니다. 문제는 ~의 경로가 작동하지 않는다는 것입니다. 상대 경로처럼 취급되며, IMHO는 패브릭의 버그입니다. 그게 제가 시도한 것입니다. 따라서해야 할 일 (예 : 방미제를 사용하는 경우) cd('/home/vagrant/foo'). 당신이 cd('bar')를 호출 할 때 현재 작업 디렉토리가 정확히 알고 있기 때문에

아마 당신은 중첩 된 컨텍스트 관리자

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

에서 떨어져 상대 경로로 얻을 수 있습니다. 그러나 최상위 레벨이 cd 인 경우 함수가 다른 함수 (fab에서 직접적으로가 아니라)에서 호출 될 수있는 경우 절대 경로를 사용해야합니다.

+0

'os.path.expanduser ("~/some_thing")'을 사용하면 전체 경로를 얻을 수 있습니다. –

+1

가상 머신이 아닌 내 컴퓨터에서 사용자를 확장하지 않습니까? – asmeurer

+0

오 아마도 ,,, 시도하고 볼 ... 정말 모르겠다. –