【Spinning Up】parse_args(argsparse):python和命令行之间的交互

【Spinning Up】parse_args(argsparse):python和命令行之间的交互

前言:

spinning up的代码看起来实在是太痛苦了。
花里胡哨的操作debug简直要人命。
基础的Python知识,面对高段位的功能,无从下手。
没人请教,只好一个一个知识点的搜索,去弄懂它的每一个信息流。

在entry_point.py这个文件中,有一个操作是,获取编码过的ppo函数,这个我另一篇博客会分析;
但是我根本没看到它这个变量是怎么来的。
debug的时候也看不到。
然后突然就出现在argsparse里面了?
就极度离谱,我就在思考,这玩意儿到底是怎么从run_utils.py里传到了entry_point.py。

因为之间的转换是通过subprocess.check_all(cmd)实现的;
而这个cmd是下面的语句:

python entry_point.py encoded_thunk

哎,这种形式,让我想起来了,这不就是最简单的命令行执行python脚本吗?
通过命令行执行python脚本,有一个基本的传参方法就是:sys.argv

好了,案子破了,原来是这个sys.argv在其中作祟。

但是这个sys.argv又是怎么和下面的语句勾连在一块呢?

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("encoded_thunk")

我们知道,这个argparse模块非常好用,经常用来传参,设置默认参数啥的。
但是一般这个parse.add_argument()都是给了参数名字后,还要给默认参数的。
但是这里的add,为什么只给了参数名字呢?

我隐约知道了,sys.args就是传给了这个encoded_thunk,但是我没有证据。

经过百度的简单搜索:“argparse” + “sys.argv”
我找到了下面的参考链接
parse_args(argsparse):python和命令行之间的交互

例子:

假设我们创建一个“argp.py”的文件。

import sys
import argparse     # 引入模块
# 建立解析对象
parser = argparse.ArgumentParser()
parser.add_argument("encoded_thunk")         # xx.add_argument("aa")
# parser.add_argument("echo")         # xx.add_argument("aa")
# 给xx实例增加一个aa属性
# 把parser中设置的所有"add_argument"给返回到args子类实例当中
# 那么parser中增加的属性内容都会在args实例中,使用即可。
args = parser.parse_args()
parser.parse_args()
print("args.encoded_thunk:", args.encoded_thunk)     # 打印定位参数echo
print("sys.args:", sys.argv)

运行的话,在python argp.py后面加上abcd(任意);
其将输出“abcd”。因为我们把abcd赋给了args.encoded_thunk了。
打印结果:

args.encoded_thunk: abc
sys.args: ['.\\code_demo.py', 'abc']

给其设置help:
parser.add_argument(“encoded_thunk”, help = “encoded_thunkis here~”)
在命令行中输入:
python argp.py -h
就可以得到相关的帮助信息。

差不多先这样,parser是可以获取sys.args的内容的,而且得数目对得上!

继续修整spinup的鬼代码~

联系方式

ps: 欢迎做强化的同学加群一起学习:

深度强化学习-DRL:799378128

欢迎关注知乎帐号:未入门的炼丹学徒

CSDN帐号:https://blog.csdn.net/hehedadaq

猜你喜欢

转载自blog.csdn.net/hehedadaq/article/details/114601785
今日推荐