调试时模拟 argparse 命令行参数输入
Simulating argparse command line arguments input while debugging
此线程是上一个线程的扩展,可以找到 。
说,我有一个代码有两个用途,1)从整数列表中打印最大数; 2)创建一个新目录。
import argparse
import os
parser = argparse.ArgumentParser()
parser.add_argument('integers', metavar='N', type=int, nargs='+',
help='an integer for the accumulator')
parser.add_argument('--sum', dest='accumulate', action='store_const',
const=sum, default=sum,
help='sum the integers (default: find the max)')
parser.add_argument("--output_dir", type=str, default="data/xx")
def main(args):
os.makedirs(args.output_dir)
print args.accumulate(args.integers)
if __name__=='__main__':
args = parser.parse_args() # Disable during debugging @ Run through terminal
# args = argparse.Namespace(integers = 1, output_dir= 'mydata_223ss32') # Disable when run through terminal: For debugging process
main(args)
这些语句可以通过
从终端执行
python test_file.py --output_dir data/xxxx 2 2 5 --sum
但是,对于调试过程,我想跳过终端的使用。 hpaulj 的想法可以从 中找到,只是修改
if __name__=='__main__':
进入
if __name__=='__main__':
args = argparse.Namespace(output_dir= 'mydata') # Disable when run through terminal: For debugging process
main(args)
不过,我还想在调试过程中包含一个整数列表。包括整数列表和目录地址如下输出错误
args = argparse.Namespace(integers = "2 2 5", output_dir= 'mydata')
请问我哪里做错了
提前致谢
将您的代码稍微更改为:
import argparse
import sys
parser = argparse.ArgumentParser()
parser.add_argument('integers', metavar='N', type=int, nargs='+',
help='an integer for the accumulator')
parser.add_argument('--sum', dest='accumulate', action='store_const',
const=sum, default=sum,
help='sum the integers (default: find the max)')
parser.add_argument("--output_dir", type=str, default="data/xx")
def main(args):
#os.makedirs(args.output_dir) # XXX: Commented out for debugging
print(args.accumulate(args.integers))
if __name__=='__main__':
print(sys.argv)
args = parser.parse_args() # Disable during debugging @ Run through terminal
# args = argparse.Namespace(integers = 1, output_dir= 'mydata_223ss32') # Disable when run through terminal: For debugging process
print(args)
main(args)
我们可以看到,如果我们调用脚本:./test3.py --output_dir foo 1 2 3
我们的输出是:
['test3.py', '--output_dir', 'foo', '1', '2', '3']
Namespace(accumulate=<built-in function sum>, integers=[1, 2, 3], output_dir='foo')
6
所以,如果你想模拟命令行参数,你有两个选择:
1)编辑sys.argv
(个人首选):
if __name__=='__main__':
# Override sys.argv
sys.argv = ['test3.py', '--output_dir', 'foo', '1', '2', '3']
args = parser.parse_args()
main(args)
2) 创建一个Namespace
对象:
if __name__=='__main__':
#args = parser.parse_args() # Disable during debugging @ Run through terminal
args = argparse.Namespace(accumulate=sum, integers=[1,2,3], output_dir='foo')
main(args)
第二种方法的问题是双重的。首先,您将通过执行此操作跳过调试过程中非常重要的部分,调试 argparse 配置并确保参数按预期进行解析。其次,必须在此处定义由您的 argparse 配置添加的隐式默认值(例如,您的 --sum
参数/accumulate
)。如果您采用第一种方法,argparse 将处理 sys.argv
并添加 accumulate 而无需进行任何更改。在第二种方法中,我们必须按预期将 accumulate=sum
添加到 运行。
向 [jedwards 答案][1] 添加更多信息:
我正在使用 pycharm 来实现相同的目的,我需要稍微改变 jedwards 命题,这样 sys.argv
就不会被覆盖,而是会被修改。列表的第一个条目 sys.argv[0]
应该保留,因为它包含正在 运行 的文件的路径。如果不这样做,变量 parser.prog
将被弄乱,因此无法正常工作。
无需像 jedwards 那样手动将文件名添加为第一个列表条目,您只需附加到 sys.argv
并扩展列表即可:
if __name__=='__main__':
# Append additional arguments to sys.argv
sys.argv = sys.argv + ['--output_dir', 'foo', '1', '2', '3']
args = parser.parse_args()
main(args)
这使得它对文件名的更改具有弹性。
[1]:
此线程是上一个线程的扩展,可以找到
import argparse
import os
parser = argparse.ArgumentParser()
parser.add_argument('integers', metavar='N', type=int, nargs='+',
help='an integer for the accumulator')
parser.add_argument('--sum', dest='accumulate', action='store_const',
const=sum, default=sum,
help='sum the integers (default: find the max)')
parser.add_argument("--output_dir", type=str, default="data/xx")
def main(args):
os.makedirs(args.output_dir)
print args.accumulate(args.integers)
if __name__=='__main__':
args = parser.parse_args() # Disable during debugging @ Run through terminal
# args = argparse.Namespace(integers = 1, output_dir= 'mydata_223ss32') # Disable when run through terminal: For debugging process
main(args)
这些语句可以通过
从终端执行python test_file.py --output_dir data/xxxx 2 2 5 --sum
但是,对于调试过程,我想跳过终端的使用。 hpaulj 的想法可以从
if __name__=='__main__':
进入
if __name__=='__main__':
args = argparse.Namespace(output_dir= 'mydata') # Disable when run through terminal: For debugging process
main(args)
不过,我还想在调试过程中包含一个整数列表。包括整数列表和目录地址如下输出错误
args = argparse.Namespace(integers = "2 2 5", output_dir= 'mydata')
请问我哪里做错了
提前致谢
将您的代码稍微更改为:
import argparse
import sys
parser = argparse.ArgumentParser()
parser.add_argument('integers', metavar='N', type=int, nargs='+',
help='an integer for the accumulator')
parser.add_argument('--sum', dest='accumulate', action='store_const',
const=sum, default=sum,
help='sum the integers (default: find the max)')
parser.add_argument("--output_dir", type=str, default="data/xx")
def main(args):
#os.makedirs(args.output_dir) # XXX: Commented out for debugging
print(args.accumulate(args.integers))
if __name__=='__main__':
print(sys.argv)
args = parser.parse_args() # Disable during debugging @ Run through terminal
# args = argparse.Namespace(integers = 1, output_dir= 'mydata_223ss32') # Disable when run through terminal: For debugging process
print(args)
main(args)
我们可以看到,如果我们调用脚本:./test3.py --output_dir foo 1 2 3
我们的输出是:
['test3.py', '--output_dir', 'foo', '1', '2', '3'] Namespace(accumulate=<built-in function sum>, integers=[1, 2, 3], output_dir='foo') 6
所以,如果你想模拟命令行参数,你有两个选择:
1)编辑sys.argv
(个人首选):
if __name__=='__main__':
# Override sys.argv
sys.argv = ['test3.py', '--output_dir', 'foo', '1', '2', '3']
args = parser.parse_args()
main(args)
2) 创建一个Namespace
对象:
if __name__=='__main__':
#args = parser.parse_args() # Disable during debugging @ Run through terminal
args = argparse.Namespace(accumulate=sum, integers=[1,2,3], output_dir='foo')
main(args)
第二种方法的问题是双重的。首先,您将通过执行此操作跳过调试过程中非常重要的部分,调试 argparse 配置并确保参数按预期进行解析。其次,必须在此处定义由您的 argparse 配置添加的隐式默认值(例如,您的 --sum
参数/accumulate
)。如果您采用第一种方法,argparse 将处理 sys.argv
并添加 accumulate 而无需进行任何更改。在第二种方法中,我们必须按预期将 accumulate=sum
添加到 运行。
向 [jedwards 答案][1] 添加更多信息:
我正在使用 pycharm 来实现相同的目的,我需要稍微改变 jedwards 命题,这样 sys.argv
就不会被覆盖,而是会被修改。列表的第一个条目 sys.argv[0]
应该保留,因为它包含正在 运行 的文件的路径。如果不这样做,变量 parser.prog
将被弄乱,因此无法正常工作。
无需像 jedwards 那样手动将文件名添加为第一个列表条目,您只需附加到 sys.argv
并扩展列表即可:
if __name__=='__main__':
# Append additional arguments to sys.argv
sys.argv = sys.argv + ['--output_dir', 'foo', '1', '2', '3']
args = parser.parse_args()
main(args)
这使得它对文件名的更改具有弹性。
[1]: