2013-04-15 3 views
1

저는이 줄을 파이썬 스크립트에 포함하려고합니다.os.system은 둥근 괄호에 대해 불평합니다

!#/bin/bash/env python 

import os 

os.system("paste <(awk '!/^($|[:space:]*#)/{print $0}' file1) <(awk '!/^($|[:space:]*#)/{print $0} file2) > out_file") 

bash에서 직접 실행할 때 명령을 완벽하게 적용 할 수 있습니다. 그러나 스크립트 안에, 내가 얻을 :

sh: -c: line0: syntax error near unexpected token `(' 

문제가 계속 간단하게 사용하는 경우 :

os.system("paste <(cat file1) > output_file") 

어떤 아이디어?

+5

기본 셸이'sh'이고'bash'가 아닌 것 같습니다. 그리고 두 명령 줄은'sh'로는 유효하지 않습니다. – abarnert

+0

@MartijnPieters : 그는'서브 프로세스 '를 사용하지 않고'os.system'을 사용하고 있습니다. 유닉스 시스템에서, libc 함수를'system'이라고 부릅니다. OS는 당신의 OS에 달려 있으며, OP가 어떤 OS를 사용하는지 알지 못합니다. – abarnert

+0

@abarnert : 맞습니다. 내 실수. 대신에''man system' (http://linux.die.net/man/3/system)을 가리키고'/ bin/sh -c'를 사용한다고 언급 할 것입니다. –

답변

1

킬 두 마리는 :

awk -v DELIM=' ' '!/^($|[[:space:]]*#)/{a[FNR]=a[FNR]DELIM$0}END{for(i=1;i<=FNR;i++)print substr(a[i],2)}' file1 file2 

이 프로세스 교체의 필요성을 제거하고 준수 그에 sh입니다.

+0

제안 해 주셔서 감사합니다. 상황은 좀 더 복잡합니다. 파일 수를 직접 지정하지 않고 오히려 스크립트의 인수입니다 (예 : script.py file1 file2 file3 ... 다른 말로하면 : 예제를 N 개의 파일로 확장하는 방법을 모른다. 한 번에 몇 번해야하나요? file1 + file2 = part1 part1 + file3 = part2 partN-1 + fileN = final? – astabada

+0

@astabada'file1 file2 ... fileN' 스크립트 다음에 파일 목록을 구문 분석하면됩니다. 하나의 스크립트가 그것을 처리 할 수있을 때'awk'를 여러 번 (한 파일 당 한번) 호출하는 것은 잘못된 접근법입니다. 그 결과 원래 문제가 해결됩니다. –

+0

좋아, 작동 ... 하나 더 (그리고 마지막으로 바라건대) 질문. 명령을 이해할 수있는 포괄적 인 장소를 알고 계십니까? 남자 awk 충분하지 않습니다. – astabada

4

bash에서 직접 실행하면 명령을 완벽하게 적용 할 수 있습니다. 그러나 스크립트 안에, 내가 얻을 : 스크립트 내에서, 당신은 sh보다는 bash으로 명령을 실행하고 있기 때문이다

sh: -c: line0: syntax error near unexpected token `(' 

합니다. 이 명령과 더 간단한 명령은 모두 bash 특정 기능을 사용합니다. sh 셸을 실행하고 동일한 줄을 입력하면 동일한 오류가 발생합니다. 이 때문에

os.system 전화, 그것은 사용하는 것 쉘 문서화하지 않습니다

은 대부분의 유닉스 계열 시스템에서 표준 C 함수 system()

를 호출하여 구현이 sh를 호출합니다. 당신은 아마 그것에 의지해서는 안됩니다 ...하지만 확실히bash에 의존해서는 안됩니다!

당신은 subprocess 모듈을 사용, bash 명령을 실행하고 명시 적으로 bash를 실행하려면 : 당신은, 나는 가정, 쉘 내에서 서브 쉘로 bash을 실행할 수있는 인용 권리를 얻기 위해 시도 할 수

subprocess.call(['bash', '-c', 'paste <(cat file1) > output_file']) 

system 사용 ...하지만 왜 귀찮게합니까?

os.system 대신 subprocess을 사용해야한다고 설명하는 많은 이유 중 하나입니다. 하나 awk 스크립트

+0

그리고'bash'에서 명령을 실행하기 위해서는 이것을 추가해야합니다. [이 답변] (http://stackoverflow.com/a/4256153/418609)에서와 같이 하위 프로세스를 사용하십시오. – adrianp

+0

@adrianp : 그 대답은'bash'를 명시 적으로 사용하는 방법을 보여주지 않습니다; 그것은 OP가 원하는 것이 아닌 쉘을 사용하지 않고'cwm' 명령을 실행하는 방법을 보여줍니다. – abarnert

관련 문제