在 python 中通过文件传递命令行参数的最佳方式
Best way to pass command line arguments via file in python
我有很多论据要传递给我的main.py
。将它们存储在 txt 文件中更容易。所以,我想知道使用 "config" 文件传递 CL args 的最佳方法。
Shell 不幸的是,脚本不是我需要的。
使用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'
这是一个简单的函数,可以将任何 @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 或更高版本。
- 参数文件中可能有
@
个参数。展开是递归的。
如果你打算使用argparse
, then fromfile_prefix_chars
就是为了解决这个问题而设计的。
在您的启动程序中,将所有参数(每行一个)放入一个文件中。将 @file.txt
传递给您的子程序。在您的子程序中,将 fromfile_prefix_chars
参数传递给 ArgumentParser()
构造函数:
parser = argparse.ArgumentParser(fromfile_prefix_chars='@')
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)
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'])
我有很多论据要传递给我的main.py
。将它们存储在 txt 文件中更容易。所以,我想知道使用 "config" 文件传递 CL args 的最佳方法。
Shell 不幸的是,脚本不是我需要的。
使用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'
这是一个简单的函数,可以将任何 @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 或更高版本。
- 参数文件中可能有
@
个参数。展开是递归的。
如果你打算使用argparse
, then fromfile_prefix_chars
就是为了解决这个问题而设计的。
在您的启动程序中,将所有参数(每行一个)放入一个文件中。将 @file.txt
传递给您的子程序。在您的子程序中,将 fromfile_prefix_chars
参数传递给 ArgumentParser()
构造函数:
parser = argparse.ArgumentParser(fromfile_prefix_chars='@')
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)
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'])