2016-07-07 7 views
2

이 curl 명령어를 유닉스 쉘에서 실행하면 작동합니다 (아래 참조). 반환 된 데이터를 파일로 리디렉션 할 수 있었지만 이제 파일에 많은 공간을 낭비하는 대신 코드에서 데이터를 처리하려고합니다.Popen에서 Python의 컬 사용하기

curl -k -o outputfile.txt 'obfuscatedandVeryLongAddress' 
#curl command above, python representation below 
addr = "obfuscatedandVeryLongAddress" 
theFile = subprocess.Popen(["curl", "-k", addr], stdout = subprocess.PIPE, stderr = subprocess.PIPE, shell = True) 

이후에는 파일 .stdout이 비어 있습니다. curl 명령에서 리턴 된 데이터는 4,000 행과 같아야합니다 (쉘에서 명령을 실행할 때 검증 됨). 크기가 theFile.stdout을 깨는가? 내가 뭔가 잘못하고 있는거야?

out, err = theFile.communicate() 

을 다음

편집 아웃 변수하지만 여전히 아무것도 인쇄 : 서식 및 설명 당신은 shell=True를 제거해야

+2

왜'requests' 라이브러리를 사용하지 않습니까? 또는 시스템 기본 'urllib'? – SuperSaiyan

+1

related : [왜 shell = True로 내 서브 프로세스를 먹을 수 있습니까?] (http://stackoverflow.com/q/10661457/4279) – jfs

답변

2

을 내가 사용했습니다.

theFile = subprocess.Popen(["curl", "-k", addr], stdout = subprocess.PIPE, stderr = subprocess.PIPE)

작동합니다.

shell=True을 수행하는 경우 문자열을 전달해야합니다. 그렇지 않으면 실제로 쉘이 인수로 -kaddr을 인수로 전달합니다. 따라서 쉘이 sh 인 경우 수행중인 작업은 sh 'curl' -k addr입니다.

0

Eugene 's는 질문에 대한 직접적인 대답이지만, 코드를 덜 필요로하고 코드를 볼 필요가있는 사람이라면 쉽게 읽을 수 있기 때문에 requests 라이브러리를 사용하는 방법을 추가 할 것입니다. 크로스 플랫폼이되는 이점).

import requests 

response = requests.get('longaddress', verify=False) 
print response.text 

응답이 JSON 인 경우, 자동으로 파이썬 객체로 변환 할 수 있습니다

print response.json() 
0

당신은 같은 문자열에서 curl 명령을 넣을 수 있습니다 :

theFile = subprocess.Popen('curl -k {}'.format(addr), stdout = subprocess.PIPE, stderr = subprocess.PIPE, shell = True) 

또는 당신이 할 수있는 셸 인수를 제거하십시오.

theFile = subprocess.Popen(["curl", "-k", addr], stdout = subprocess.PIPE, stderr = subprocess.PIPE) 

또는 pycurl 모듈을 사용하여 libcurl 라이브러리를 직접 사용할 수 있으며 전체 프로세스를 건너 뛸 수 있습니다.