Python optpasse,有一个选项取决于另一个选项

Python optpasse,有一个选项取决于另一个选项,python,command-line-arguments,Python,Command Line Arguments,有没有办法让以下各项发挥作用? 我所寻找的是,基于另一个选项的价值,有一个选项的价值 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

有没有办法让以下各项发挥作用? 我所寻找的是,基于另一个选项的价值,有一个选项的价值

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()
显然,就目前而言,它不会起作用,因为


赋值前引用的局部变量“选项”

您以后必须调整默认值。如果该选项为默认选项,则进行按摩:

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)
parser.add_选项(“--file action”,
default=“cp/bar/baz”,
dest=“fileaction”)
选项,args=parser.parse_args()
如果options.fileaction==“cp/bar/baz”:
options.fileaction=“cp%s/bar/baz”%(options.file\u name)
也就是说,在本例中,fileaction和filename似乎冲突,因此同时设置两者是毫无意义的,它们将以不明显的方式相互覆盖。我让fileaction默认为
“cp”
,并为
'/bar/baz'
添加一个
--action target
,然后从这些片段构造调用。

只需将它们都包含在内:

parser.add_option("--file-name", dest="file_name")
parser.add_option("--file-action", dest="file_action")
您可以使用简单的逻辑

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.

您的解析器是一个处理程序。它将解释python在程序启动时,您将如何处理收到的命令行。因此,在您的选项中具有依赖性是不正确的

我建议您处理代码中的默认行为。您可以执行以下操作:

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

该解决方案唯一的问题是
\u默认值将出现在“帮助”中,使其有点难看。@DawidFatyga:True。事实上,想想看,你甚至不需要一个记号笔。只要它解决为默认,它就会工作。我相应地更新了答案。好的-当有文件操作时会发生什么,如何将其设置为包含文件名?-还有,什么时候可以用空格分隔同一个参数的单词将参数传递给optpass?@InbarRose:你可以用引号,不是吗?我的观点是不要在文件操作中包含文件名。
optparse
模块自Python 2.7以来就被弃用了。您可以考虑使用<代码> AgPARSE> <代码>(),它也可以用于Python 2 .x:<代码> PIP安装AgPARSE> <代码>谢谢您的评论,但是,更改当前代码库不在列表中;我认为您没有考虑清楚这一点,首先,文件操作不应该包括文件名,否则就没有理由首先将文件名作为参数。另外,如果您打算让一个脚本接收一个文件名和一个文件操作,然后对该文件执行该操作,为什么不简单地使用3个参数“file name”“file command”“file arguments”然后根据需要将它们放在一起?@InbarRose
文件名
文件操作
仅用于示例,它们在我的程序中不是真正的用途。