2012-04-03 2 views
1

파이썬에서 스크립트의 subprocess.call 연산자를 사용하는 데 어려움을 겪고 있습니다. 파이프 라인 프로그램 (bowtie)을 여러 번 실행 한 다음 다른 방법으로 출력을 사용해야합니다. 이를 위해 subprocess.call을 사용하고 있습니다.파이썬에서 subprocess.call을 사용하는 멀티 파일 stdin (bowtie 용)

문제는 bowtie가 입력 파일 2 개, 색인 및 텍스트 파일을 가져오고 둘 다 stdin 매개 변수에 할당 할 수 없다는 것입니다.

또한 args에 색인 경로를 포함 시키려고했지만 bowtie는 색인으로 인식하지 못하고 오류가 발생합니다. Sincer이 색인은 항상 동일합니다.이 문제를 피할 수있는 방법이 있습니까?

여기에 내가 (매우 원시)에서 일하고 있어요 코드의 일부 :

inpath = "/media/2tbhd/workdata/nanocage_noadapt/zf/fasta/zf_ad_c_r2.fasta" 
ind_path = "indexes/zf_gen_topl" 
for elem in plist: 
     cmd = subprocess.call(["bowtie","-f","-v 3", "--best" "--suppress 6,7" "-p 6"], shell = True, stdin = inpath, ind_path) 
+0

커맨드 라인에서'bowtie'를 어떻게 부르시겠습니까? 내가 아는 프로그래밍 언어로 stdin에 두 파일을 할당 할 수는 없습니다 ... – mgilson

+1

"물론 bowtie가 색인으로 인식하지 못하여 오류가 발생합니다"- 어떤 오류 메시지가 특별히 나옵니까? –

+0

bowtie를 원하는 방식으로 호출하는 일반 셸 명령을 작성하고 작동하는지 확인하십시오. 작동하는 경우 여기에 붙여 넣기 만하면 subprocess.call 함수로 변환하는 방법을 쉽게 알 수 있습니다. 작동하지 않으면 나는 bowtie로 잘못한 것을 알아낼 수 있습니다. – weronika

답변

0

내가 bowtie에 대해 아무것도 몰라,하지만 전화 같은 것을해야한다고 나에게 보인다

cmd = subprocess.call(['bowtie','-f',inpath,'-v','3', '--best','--suppress','6,7','-p','6',ind_path]) 

일반적으로 인수 목록을 명령 줄에서와 똑같이 하위 프로세스에 전달합니다. 명령 줄이 어떻게 보이는지 알면 멋진 shlex 모듈을 사용하여 명령을 분리 할 수 ​​있습니다. 예 :

import shlex 
import subprocess 
cmd=subprocess.call(shlex.split("ls -al")) 
0

사용자의 입력 파일은 파일이 다른 프로세스에서 데이터를 파이프하지 (그것이 당신의 예에의 모습입니다) 실제로 경우에, 나는 당신이 당신의 하위 프로세스의 STDIN을 사용한다고 생각하지 않습니다 . 콜 기능!
그리고 내가 아는 한 정상적인 명령 줄 bowtie에 STDIN을 통해 인덱스를 제공 할 수 없습니다.이 명령은 파일이어야합니다. 그래서 확실히 STDIN이 아니라 일반적인 인수가되어야합니다.

내가 일반적으로 스크립트에서 나비 넥타이를 호출하는 방법입니다 (입력 파일과 파일과 인덱스 모두, 더 STDIN 사용하지 않음) :

subprocess.call(["bowtie %s %s %s %s"(full_options,indexname,infile,outfile)], 
       shell=True) 

full_options'-f -m1 -v1 --best --tryhard -S --sam-nosq'indexname 같은 것이 'Chlre4nm_cassette_new_m' 같은 것입니다되는 경우 (bowtie가 색인 파일을 감지하는 방법 인 쉘 환경 변수 $BOWTIE_INDEXES에 의해 주어진 디렉토리에서 Chlre4nm_cassette_new_m. *. ebwt 형식의 색인 파일 이름 세트의 기본 이름).

아마도 저는 subprocess.call을 잘못 사용하고있는 것을 알고 있으며 내 명령/옵션/args를 다른 대답과 같은 목록으로 분할해야합니다. 이것은 오래된 코드이지만 작동합니다.

+0

당신이 "bowtie % s ..."를 목록에 넣을 필요가 없다고 말하는이 방법은 (나는 믿는다) ... 나는 subprocess.call이 문자열을 받아 들일 것이라고 생각한다. 문자열을 목록으로 분할하면 셸에 대한 종속성을 제거 할 수 있다는 장점이 있습니다.이 종속성은보다 효율적이어야하며 악의적 인 사용자가 공격하는 경향이 적습니다.스크립트가 사용한다면 (그리고 당신은 악의적이지 않다), 성능이 문제가되지 않는다면, 내 생각에는 완벽하게 받아 들일 수 있습니다 ... – mgilson

+0

@mgilson - 감사합니다! 나는 이것이 실제로 작동한다는 것을 안다. (실제로 사용하는 코드이다.) 목록으로 나눌 이유가 있는지는 몰랐다. 한 가지 질문 : "쉘에 대한 종속성 제거"가 정확히 무엇을 의미합니까? 나는 $ BOWTIE_INDEXES 쉘 변수를 사용하여 인덱스 파일을 찾는데 의존하기 때문에 bowtie에 대해 그렇게 할 수 있는지 확신 할 수 없기 때문에 묻습니다. shell = False로 설정하면 여전히 작동합니까? – weronika

+0

서브 프로세스가 실제로 명령을 실행하기 위해 새로운 쉘 (/ bin/sh)을 생성한다는 인상하에 있었지만 문서는 사실이 시점에서 모호합니다 ... 그러나 이것은 new shell ... 쉘 변수가 환경에 설정되어 있다면, 그것은 파이썬과 파이썬이 생성하는 모든 서브 프로세스에 의해 상속되어야합니다 (env 키워드를 사용하지 않는 한 ...) http : //docs.python .org/library/subprocess.html # popen-constructor – mgilson