2010-04-03 2 views
3

사용자가 하드 코딩 된 디렉토리 목록을 선택할 수있는 'cd'명령을 구현하려고하고 있으며 사용자가 목록의 항목에 해당하는 번호를 입력해야합니다. 이제 my_cd.py이라는 프로그램은 사용자를 선택한 디렉토리로 효과적으로 'cd'해야합니다. 이 작동하는 방법의 예 : 현재파이썬 스크립트에서 현재 디렉토리를 어떻게 변경합니까?

/some/directory 
$ my_cd.py 
1) ~ 
2) /bin/ 
3) /usr 
Enter menu selection, or q to quit: 2 

/bin 
$ 

, 나는 os.chdir('dir')를 사용하여 'CD'에 노력하고있어. 그러나 이는 자체 하위 프로세스에서 my_cd.py이 시작 되었기 때문에 작동하지 않습니다. 나는이 작업을 얻을 수있는 방법에

#! /bin/bash 
function my_cd() { 
    /path/to/my_cd.py 
} 

/some/directory 
$ . my_cd.sh 
$ my_cd 
... shows list of dirs, but doesn't 'cd' in the interactive shell 

어떤 아이디어 : 나는 my_cd.sh라는 이름의 소스 bash는 스크립트에서 my_cd.py에 대한 호출을 포장하려고? Python 스크립트에서 대화 형 쉘의 현재 디렉토리를 변경할 수 있습니까?

답변

1

이 작업을 수행 할 수 없습니다. 부모 프로세스에서는 작업 디렉토리의 변경 사항을 볼 수 없습니다. 기껏해야 파이썬 스크립트에서 변경할 디렉토리를 인쇄 한 다음 소스 스크립트가 실제로 그 디렉토리로 변경되게 할 수 있습니다.

+0

정답입니다! 이렇게 할 방법이 없습니다. –

3

my_cd.py :

#!/usr/bin/env python 
import sys 

dirs = ['/usr/bin', '/bin', '~'] 
for n, dir in enumerate(dirs): 
    sys.stderr.write('%d) %s\n' % (n+1, dir)) 
sys.stderr.write('Choice: ') 
n = int(raw_input()) 
print dirs[n-1] 

사용법 :에 그 cosmetic 출력 (모든 메시지를 할

#! /bin/bash 
function my_cd() { 
    cd `/path/to/my_cd.py` 
} 

하고 파이썬 코드 :

nosklo:/tmp$ alias mcd="cd \$(/path/to/my_cd.py)" 
nosklo:/tmp$ mcd 
1) /usr/bin 
2) /bin 
3) ~ 
Choice: 1 
nosklo:/usr/bin$ 
+0

작은 따옴표를 사용하면 달러 기호를 벗어날 필요가 없습니다.'alias mcd = 'cd $ (/ path/to/my_cd.py)'' –

6
가에 공급 bash 코드를 변경

사용자, 메뉴 등)가 sys.stderr에 있습니다. , 결국 os.chdir 대신 print (~ sys.stdout)까지 디렉토리를 변경해야하는 경로를 지정합니다. 이 질문은 또한 "bash는"태그가 있기 때문에 그 가치는 여기에 간단한 bash는 전용 솔루션이 무엇인지에 대한

2

: 이제

$ cat select_cd 
#!/bin/bash 

PS3="Number: " 

dir_choices="/home/klittle /local_home/oracle" 

select CHOICE in $dir_choices; do 
    break 
done 

[[ "$CHOICE" != "" ]] && eval 'cd '$CHOICE 

,이 스크립트가 실행되지, source'd해야합니다

$ pwd 
/home/klittle/bin 
$ source select_cd 
1) /home/klittle 
2) /local_home/oracle 
Number: 2 
$ pwd 
/local_home/oracle 

그래서,

$ alias mycd='source /home/klittle/bin/select_cd' 
$ mycd 
1) /home/klittle 
2) /local_home/oracle 
Number: 

당신의 사건을 해결하려면, 당신은 명령을 가질 수 사용자가 실행 별칭 있도록 할 는 dir 선택을 먼저하는 bash 스크립트를 요구 한 다음, cd가 완료된 후 파이썬 프로그램으로 빠져 나갑니다.

1

앞에서 말한 것과는 달리 프로세스 이미지를 두 번 바꾸면됩니다.

배쉬에서, 당신의 my_cd 기능을 대체 :

function my_cd() { 
    exec /path/to/my_cd.py "$BASH" "$0" 
} 

이 그런 다음 파이썬 스크립트를 마무리 할 수 ​​있습니다
os.execl(sys.argv[1], sys.argv[2]) 

스크립트의 시작 부분에 import os, sys해야합니다.

하지만 경계선 해킹입니다. 쉘이 죽으면 서 파이썬 스크립트로 대체하고 같은 프로세스에서 을 실행하십시오.. 파이썬 스크립트는 환경을 변경하고 동일한 프로세스에서 쉘을 다시 대체합니다. 즉, 이전 쉘 세션에서 저장되지 않은 또 다른 지역의 비공개 데이터 나 환경이있는 경우 새 쉘 세션으로 지속되지 않습니다. 또한 rc 및 프로필 스크립트가 다시 실행된다는 것을 의미합니다 (일반적으로 문제가 아닌).

관련 문제