2010-07-15 6 views
3

내 회사 스크립트 중 하나를 csh에서 Python으로 변환하는 데 문제가 있습니다. csh 스크립트는 별명이 지정된 명령을 호출하지만 os.system()을 통해 동일한 별칭이 지정된 명령을 호출하면 작동하지 않습니다. foo이 별칭 명령 인 경우Python 2.3에서 os.system() 한계 극복

그래서 :

CSH 스크립트 (이 작품 실행 foo는) :

foo <argument> 

파이썬 (이 오류는 알 수없는 명령 푸 주장 작동하지 않습니다) 내가 t에서 만든 별칭에 액세스 할 수 없습니다 파이썬의 원인이되는 파이썬 스크립트를 실행할 때 발생하는 컨텍스트 스위치의 일종이 있어야 파악

os.system("foo <argument>") 

그 껍질. 설명서를 읽은 후 subprocess에 대해 이 사용 중지되었으며 그 중 subprocessshell 매개 변수가있는 것 같습니다. 문제는 저를 도울 수 있습니다 ... 문제는 내가 Python 2.3을 사용하여 붙어있어 subprocess isn ' 버전 2.4까지 사용할 수 없습니다.

저는 파이썬에서 별칭을 복제 할 생각이있었습니다. 예를 들어 foocp이라는 별칭이 지정되었습니다.

CSH :

alias foo cp 
foo file1 file2 

파이썬 :

os.system("alias foo cp") 
os.system("foo file1 file2") 

없음 주사위 없습니다 ... 여기뿐만 아니라 오류 :

sh: line 0: alias: foo: not found 
sh: line 0: alias: cp: not found 
sh: foo: command not found 

내 마지막 도랑 노력의 몇 줄을하는 것입니다 코드는 foo을 사용하고 파이썬이 호출 할 자신의 CSH 스크립트에 넣습니다. 그러나 이것에 의지하지 않고이 일을 할 수있는 방법이 있다면, 나는 그것에 대해 알고 싶습니다.

미리 감사드립니다.

답변

8

os.system이 csh를 사용하게 된 이유는 무엇입니까? 그것은 유닉스 시스템에서 기본/bin/sh를 호출 할 표준 C 함수 시스템을 사용합니다. 이것은 csh가 아니지만 bash 또는 그보다 간단한 버전 일 것입니다.

BTW : os.system의 쉘 환경에서 수행하는 작업은 각각 다른 하위 쉘에서 실행되므로 이후 os.system 호출에 영향을주지 않습니다. 즉, 환경에 대한 변경 사항이 손실됩니다./bin/sh가 csh와 다른 별명을 사용하기 때문에 별칭에 대한 호출이 실패합니다.

당신은 라인을 따라하지 foo하지만, 뭔가를 실행하여이 문제를 해결 수 :

os.system("/bin/csh -i -c 'foo arg1 arg2'") 

주 시작 스크립트를 읽어 csh를 강제하도록되어있는 옵션 -i.

+0

"os.system이 csh를 사용하게 된 이유는 무엇입니까?" 무식? :) 그냥 명령 줄에 문자열을 전달했다고 생각했습니다. 답변 해 주셔서 감사합니다. 이 문제는 내가 가지고있는 문제를 해결하지만 불행히도 모든 호출이 자체 서브 쉘에서 실행되기 때문에 다른 솔루션을 모두 찾아야 할 것입니다. 'foo' 명령의 성질은 스크립트에서 사용할 다른 것들을로드하므로, os.system 명령이 끝나자 마자 잃어 버리면 작동하지 않습니다. –

+1

그것은 명령 줄에 물건을 전달합니다. 그것은 명령 행의 단일 * 유형 *이 없다는 것입니다.) 후속 명령에 대해 다른 내용을로드하고 전체 내용을 파이썬으로 변환하는 경우, 다른 내용을 먼저 파이썬으로 변환해야합니다.) –

0

파이썬에서 "foo는"별칭이하고자하는 경우, 호출 os.system을하기 전에 자신의 별명을 수행

cmd = "foo file1 file2" 
foo_alias = "cp" 

cmd = re.sub("^foo ", foo_alias + " ", cmd) 
os.system(cmd) 

푸 별칭 (인수 대체 등으로) 더 정교한 경우 , 이것은 더 어려울 수 있습니다.