Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何让argparse在位置参数之后使用选项从文件中读取参数_Python_Argparse - Fatal编程技术网

Python 如何让argparse在位置参数之后使用选项从文件中读取参数

Python 如何让argparse在位置参数之后使用选项从文件中读取参数,python,argparse,Python,Argparse,我希望能够将命令行参数放入文件中,然后使用选项(而不是前缀字符)通过argparse将它们传递给python程序,例如: $python myprogram.py 12--foo 1-A somefile.txt--bar 2 这几乎与相同,只是我需要在开始时有一些位置参数;当该解决方案调用parse_args时,如果文件中没有位置参数,则会失败。ifsomefile.txt包含 one two three 然后 使用前缀char实际上与 $ python myprogram.py 1 2

我希望能够将命令行参数放入文件中,然后使用选项(而不是前缀字符)通过argparse将它们传递给python程序,例如:

$python myprogram.py 12--foo 1-A somefile.txt--bar 2

这几乎与相同,只是我需要在开始时有一些位置参数;当该解决方案调用
parse_args
时,如果文件中没有位置参数,则会失败。

if
somefile.txt
包含

one
two
three
然后

使用
前缀char
实际上与

$ python myprogram.py 1 2 --foo 1 one two three --bar 2
换句话说,就在解析开始时,@文件被读取,其内容被拼接到
argv
列表中。从这里开始,解析正常进行

我在另一个问题中建议的一件事是在解析之前自己实现拼接

您所指的答案使用
自定义
操作;在通常的
操作
仅将
放置在
命名空间
中的位置,此操作读取并解析文件:

parser.parse_args(f.read().split(), namespace)
变量解析为新的
命名空间
,并有选择地将值复制到主
命名空间

显然,您的问题是解析器有一些必需的参数,如果文件中不包含这些参数,则此
parse_args
将引发错误。这并不奇怪

一种解决方案是为这个文件使用一个不同的
解析器
,一个专门用于处理文件内容的解析器。我只是从全球范围来定义它

alt_parser.parse_args(f.read().split(), namespace)
换句话说,您不必使用作为参数传入的
解析器

另一种方法是将文件名放在名称空间中,并在第一次解析后处理它:

args = parser.parse_args()
if args.A:
    argv = open(args.A).read().split()
    args1 = alt_parser.parse_args(argv)

但是您可能会问,我们不能告诉您已经解析了哪些参数,并在处理
-A
时将其考虑在内吗?
解析器
不是状态机;解析不会改变它的任何属性。到目前为止,唯一反映解析的变量是
名称空间
。所有其他解析变量都是调用代码的本地变量。

应该说:
@
做了正确的事情,但我正在复制另一个程序的行为。这是有道理的;现在的诀窍是使用相同的参数生成第二个解析器,但不使用所需的位置参数。您可以首先生成该解析器,并将其用作主解析器的父级。然后只需将
位置
添加到
子项
args = parser.parse_args()
if args.A:
    argv = open(args.A).read().split()
    args1 = alt_parser.parse_args(argv)