2012-10-31 5 views
0

완전한 초보자 질문입니다.python 명령 줄 인수 구문 분석

API를 사용하여 동영상 데이터베이스를 검색하기위한 클래스를 개발 중입니다. 내가 사용하고있는 서비스에서 하나 개의 결과를 산출이 특정 쿼리를 수행

import moviesearch 

movie_db = moviesearch.MovieSearch() 
result = movie_db.search('Clockwork Orange', year='1971') 
print result 

: 당신은 파이썬 인터프리터 내에서 영화 제목과 올해를 사용하여 쿼리를 만드는 방법은 다음과

이다.

테스트를 위해 입력 저장하려면, 나는 다음과 같은 스크립트 m.py을 만들었습니다

from sys import argv 
import moviesearch 

script, movie_name, params = argv 

movie_db = moviesearch.MovieSearch() 
result = movie_db.search(movie_name, params) 
print result 

나는이 스크립트과 같이 실행하면 :

python m.py 'Clockwork Orange', year='1971' 

서비스 수익률이 개 결과.

이렇게하면 스크립트로 클래스를 테스트 할 때 매개 변수의 형식을 지정하는 방식에 문제가있는 것입니다. 누군가 내가 잘못하고있는 것을 말해 줄 수 있습니까?

내가 틀린 것을 알아 내는데 필요하다고 생각하지 않기 때문에 동영상 데이터베이스를 쿼리하는 클래스는 포함하지 않습니다. 필자가 알아야 할 것은 스크립트를 사용할 때 매개 변수의 형식을 올바르게 지정하여 Python 인터프리터에서 직접 클래스를 사용하는 위의 예제에서와 똑같이 실행하는 것입니다.

미리 도움을 청하십시오.

+1

'sys.argv'; 그것은 아마도 당신이 기대하는 것이 아닙니다. Windows에서 무엇이 될지 정확히 모르겠지만'sh' 호환 쉘에서는''m.py ','Clockwork Orange ','year = 1971 '''이 될 것입니다. – abarnert

+0

추신 : 질문 제목이 오해의 소지가 있습니다. 두 경우 모두 클래스를 작성하지 않았고 두 경우 모두 동일한 클래스 ('moviesearch.MovieSearch')를 사용하고 있으므로이 클래스는 "클래스 대 스크립트"가 아닙니다. 실제로 명령 줄 인수를 구문 분석하는 방법에 관한 것입니다. – abarnert

+0

팁 주셔서 감사합니다. 제목이 변경되었습니다. –

답변

5

당신은 쉘에서이 작업을 수행 할 때 (내가 쉬 호환 쉘과 유닉스 계열의 플랫폼을 믿고있어, 윈도우 아마 약간 다릅니다) :

python m.py 'Clockwork Orange', year='1971' 

sys.argv 목록은 다음과 같습니다

그래서
['m.py', 'Clockwork Orange,', 'year=1971'] 

, 당신이 할 때 :

당신은 movie_name 세트와 끝까지
script, movie_name, params = argv 

문자열은 'Clockwork Orange,' (쉼표로 추가)이고 params'year=1971' 문자열로 설정됩니다. 그래서, 전화는 궁극적 :

result = movie_db.search('Clockwork Orange,', 'year=1971') 

이 동일하지 않습니다 :

result = movie_db.search('Clockwork Orange', year='1971') 

그럼, 어떻게 당신은 당신이 원하는 것을 얻을 수 있습니까?

글쎄, 당신은이 같은 코드 뭔가의 PARAMS을 구문 분석 할 수 있습니다 :

params = dict(pair.split('=') for pair in argv[2:]) 
result = movie_db.search(movie_name, **params) 

첫 번째 줄은 {'year': '1971'} 당신에게 dict을 줄 것이다. 그런 다음 ** 구문을 사용하여 dict을 키워드 인수로 전달할 수 있습니다.

마지막으로 스크립트를 실행하는 데 사용하는 인수에서 여분의 쉼표를 제거해야합니다.(코드를 제거 할 수는 있지만 오타가있는 것처럼 보입니다. 더 나은 해결 방법은 오타를 만들지 않는 것입니다.)

+0

그랬어. 모든 것에 감사드립니다! –