2012-12-11 4 views
2

다음을 수행하는 방법이 있습니까? 내가 찾고있는 것은 다른 옵션의 값에 따라 하나의 옵션 값을 갖는 것입니다. 그것은, 그것은 작동하지 않습니다 순간에 같이하나의 옵션을 갖는 파이썬 optparse는 다른 것에 의존합니다.

import optparse 
parser = optparse.OptionParser() 

parser.add_option("--file-name", default="/foo/bar", dest="file_name") 

parser.add_option("--file-action", 
    default="cp %s /bar/baz" % (options.file_name), 
    dest="fileaction") 

options, args = parser.parse_args() 

물론,

지역 변수 '옵션'은 할당 당신은 나중에 기본 마사지를해야합니다

+1

'optparse' 모듈은 Python 2.7부터 사용되지 않습니다. 대신 Python 2.x에서 사용할 수있는'argpse' (http://docs.python.org/dev/library/argparse.html)를 사용할 수도 있습니다 :'pip install argparse' –

+0

주석에 감사드립니다. 현재 코드베이스를 변경하는 것이 목록에 없습니다 ;-) –

+1

처음에는 파일 - 액션에 파일 이름이 포함되어서는 안된다고 생각했습니다. 그렇지 않으면 파일 이름을 파일 이름으로 포함 할 필요가 없습니다. 매개 변수. 또한 파일 - 액션에 파일 - 액션을 받아서 그 파일에 대한 액션을 수행하는 스크립트를 사용하고자한다면 "file-name", "file-command", "file-arguments" "그런 다음 원하는대로 간단하게 조합하십시오. –

답변

1

은 단지 그들 모두가 있습니다.

if options.file_name: 
    #do code relating to file_action 

또는

if options.file_action and not options.file_name: 
    raise ValueError("No Filename specified") 
# do your code here. 
+2

그는 둘 다 가지고 있습니다 ... –

0

전에 참조하기 때문이다. 옵션이 기본이라면, 마사지 수행이 두 가지를 동시에 설정하는 것이 무의미 있도록이 예에서 말했다

parser.add_option("--file-action", 
    default="cp <filename> /bar/baz", 
    dest="fileaction") 

options, args = parser.parse_args() 

if options.fileaction == "cp <filename> /bar/baz": 
    options.fileaction = "cp %s /bar/baz" % (options.file_name) 

, fileaction와 파일 이름이 충돌하는 것을, 그들은 덮어 쓸 수 있습니다 서로 분명하지 않은 방식으로 파일 작업의 기본값을 "cp"으로 설정하고 '/bar/baz'--action-target을 추가 한 다음이 부분의 호출을 구성하면됩니다.

parser.add_option("--file-name", dest="file_name") 
parser.add_option("--file-action", dest="file_action") 

당신이 간단한 논리를 사용할 수 있습니다

+0

유일한 해결책은 '__default__' 값이 도움말에 표시되어 약간 못 생기는 것입니다. –

+0

@DawidFatyga : 참. 사실, 생각 해보니 마커가 필요하지 않습니다. 기본값으로 해결되면 작동 할 것입니다. 그에 따라 대답을 업데이트했습니다. –

+0

괜찮아요 - 파일 - 액션이있을 때 어떻게 될까요? 어떻게 파일 이름을 포함하도록 설정 될까요? 또한, 같은 인수의 단어를 분리하는 공백을 사용하여 optparse에 인수를 전달할 수있는 시점은 언제입니까? –

0

귀하의 파서는 핸들러입니다. 프로그램이 시작될 때 커맨드 라인을 통해 수행 할 작업을 파이썬에 설명합니다. 따라서 귀하의 선택에 의존하는 것은 잘못된 것입니다.

코드에서 기본 동작을 처리하는 것이 좋습니다. 다음과 같이 할 수 있습니다 :

parser.add_option("--file-action", 
default=None, 
dest="fileaction") 

options, args = parser.parse_args() 

# Manage the default behaviour 
if not options.fileaction: 
    fileaction = "cp %s /bar/baz" % (options.file_name) 
    # You could then use fileaction the way you would use options.fileaction 
관련 문제