假设我有输入文件选项和输出文件选项。如何创建一个结合两者的选项?例如:
$ ./my_script.py -i input.txt -o output.txt
可以合并为:
$ ./my_script.py --io input_output.txt
您可以说我可以-io
组合两个选项,但-io filename
是-i -o filename
的快捷方式,而不是-i filename -o filename
。
我认为可以在我的dest=('input', 'output')
调用中添加.add_argument()
,但这会引发dest
必须是字符串的错误。
我尝试在一侧添加一个互斥的组--io
,另一侧添加一组-i
和-o
,但-i
和-o
的帮助文本当程序与--help
一起运行时,usage: myscript.py [-h] [--io] [-i INPUT] [-o OUTPUT]
optional arguments:
-h, --help show this help message and exit
--io Use file as both input and output
不再显示:
--io
此外,相互排斥的部分似乎不起作用。我仍然可以使用-i
和单独的-o
和import argparse
parser = argparse.ArgumentParser()
parser.add_argument("-i", "--input", help="Input file")
parser.add_argument("-o", "--output", help="Output file")
parser.parse_args()
选项调用脚本,并且不会出现错误。
这是我的骨架代码:
import argparse
parser = argparse.ArgumentParser()
exclusive = parser.add_mutually_exclusive_group()
exclusive.add_argument("--io", help="Input and Output")
sub = exclusive.add_argument_group()
sub.add_argument("-i", "--input", help="Input file")
sub.add_argument("-o", "--output", help="Output file")
args = parser.parse_args()
if args.io:
in_file = out_file = args.io
else:
in_file = args.input
out_file = args.output
包含代码的代码:
package Database;
import java.sql.*;
public class Database {
public static void main(String[] args) {
final String URl = "JDBC:mysql:/localhost:3306/info";
final String id = "root";
final String password = "";
try
{
Connection con1 = DriverManager.getConnection(URl,id,password);
Statement s1 = con1.createStatement();
String s = "CREATE DATABASE CLASSIFIED";
s1.executeUpdate(s);
}
catch(SQLException err)
{
System.out.println(err.getMessage());
}
}
}
答案 0 :(得分:2)
更容易解释为什么事情不起作用而不是建议解决方案。
是的,dest
必须是字符串;没有提供dest
值的列表或元组。但是你的in_file = out_file = args.io
地址发布得很好。你也可以使用:
args.in_file=args.out_file = args.io
解析后按摩args
值没有任何问题。
argument_group
不是为嵌套而设计的,也不是将{any'(或'和')逻辑添加到mutually_exclusive_group
的方法。也许在遥远的未来,将有一种方法来定义一整套逻辑组合,但现在不是。实际上进行测试并不困难;很难定义API和使用格式。
另请注意,mutually_exclusive_group
用于格式化参数的co_ocurrance的使用和测试,而argument_group
用于对参数帮助行进行分组。两个非常不同的目的。
如果-i
是store_true
参数,则-io filename
将被理解为-i -o filename
。但是,-i filename -o filename
的翻译不在当前代码中(并且可能不足以保证补丁)。
如果您仍想使用-i
,-o
和--io
(我更喜欢--
2个字符标记),我可以提出以下几点建议:
编写一个自定义用法,演示您想要的内容。如果很难写清楚用法,那么你的设计可能太复杂了。
解析后进行自己的exclusive groups
测试。 args.in_file is None
是测试是否使用过标记的好方法。另一种可能性是定义默认值,以便您不关心用户使用哪种组合。
答案 1 :(得分:0)
保持简单 - 无论如何,您展示的独家群组代码并未排除使用这两种形式。试试这个:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("-i", "--input", help="Input file")
parser.add_argument("-o", "--output", help="Output file")
parser.add_argument("--io", help="Input and Output")
parser.parse_args()
if args.io:
assert args.input is None and args.output is None
args.input = args.output = args.io
else:
assert args.input and args.output