Python中通过文件传递命令行参数的最佳方法

4

我有很多参数要传递给我的main.py。把它们存储在文本文件中会更容易。因此,我想知道使用“配置”文件传递CL参数的最佳方式。 不幸的是,shell脚本并不是我需要的。


除了 shell 脚本之外,还有其他的吗? - Ignacio Vazquez-Abrams
你的 main.py 目前是如何解析它的参数的? - Robᵩ
@Robᵩ 我还不知道。我可以根据我的需求来实现它。 - Ladenkov Vladislav
1
相关链接:https://dev59.com/6l4c5IYBdhLWcg3w3tgu - Robᵩ
1
更多相关信息请参考:https://docs.python.org/2/library/argparse.html#fromfile-prefix-chars - Robᵩ
3个回答

5
如果您计划使用 argparse,那么fromfile_prefix_chars正是为解决这个问题而设计的。
在启动程序中,将所有参数逐行放入一个文件中。将@file.txt传递给子程序。在子程序中,向ArgumentParser()构造函数传递一个fromfile_prefix_chars参数即可:
parser = argparse.ArgumentParser(fromfile_prefix_chars='@')
< p > argparse 会为您处理其余部分。

这里有一个例子:

from argparse import ArgumentParser

parser = ArgumentParser(fromfile_prefix_chars='@')
parser.add_argument('-f', '--foo')
parser.add_argument('--bar')
parser.add_argument('q', nargs='*')

ns = parser.parse_args()
print(ns)
< p > 文件 foo.txt 的内容:

-f
1
--bar=2
q one
q two

命令行和输出:

$ python zz.py @foo.txt
Namespace(bar='2', foo='1', q=['q one', 'q two'])

实际上,当在文件中放置多个参数时,我一直预料到会遇到困难。您能否举一个带有两个参数的文件和参数解析的例子? - Ladenkov Vladislav
我已经添加了一个例子。希望这有所帮助! - Robᵩ

3

使用configparser处理配置文件。它使用.ini文件,非常易于使用。

配置文件:

[DEFAULT]
KeepAlive = 45
ForwardX11 = yes

示例代码:

>>> config = configparser.ConfigParser()
>>> config.sections()
[]
>>> config.read('example.ini')
>>> for key in config['bitbucket.org']: print(key)
...
keepalive
forwardx11
>>> default = config['default']
>>> default['keepalive']
'45'
>>> default['ForwardX11']
'yes'

这很不错。但我期望更简单、更美观的东西,无论如何。 - Ladenkov Vladislav
2
你应该在这里添加一个直接的答案,因为链接的内容可能会发生变化。 - timiTao

1
这里是一个简单的函数,将任何@foo参数转换为每行一个参数的foo内容。转换后,您可以以任何正常方式使用sys.argv
import sys

def expand_arg_files(args):
    for arg in args:
       if arg.startswith('@'):
           with open(arg[1:]) as f:
               file_args = f.read().splitlines()
           yield from expand_arg_files(file_args)
       else:
           yield arg


sys.argv[:] = expand_arg_files(sys.argv[:])
print(sys.argv)

注意:

  • 生成器委托语法需要Python3.3或更高版本。
  • 参数文件中可能有@ args。扩展是递归的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接