文章目录
- 背景
- 原因
- 解决方案
- 方法1
- 方法2
背景
在Jupyter Notebook中执行如下代码报错:
import argparseparser = argparse.ArgumentParser(description="Deep Gaussian Processes on MNIST")
parser.add_argument("-n", "--num-epochs", default=5, type=int)
parser.add_argument("-t", "--num-iters", default=60, type=int)
parser.add_argument("-b", "--batch-size", default=1000, type=int)
parser.add_argument("-lr", "--learning-rate", default=0.01, type=float)args = parser.parse_args()
结果报错:
注意:这段代码只有在jupyter notebook中才会报错,在pycharm中是不会报错的。
原因
以下是个人理解,不一定对,但我认为是这样,希望对你有启发。
args = parser.parse_args()
parse_args()有两种形式:
1.parse_args()#从用户输入读取参数。
2.parse_args(args=["-n3","-b2"])#表示给n参数赋值为3,b参数赋值为2。其他参数默认。
parse_args(args=[])#表示所有参数使用默认。
而我们的报错情况是形式1,一旦执行parse_args()
语句,python系统就会执行读取参数的操作(我们看不到),此时jupyter notebook系统默认会给一个奇怪的参数:
-f C:\Users***\AppData\Roaming\jupyter\runtime\kernel-229ed901-2d6b-48ce-a402-fc5d3a697aea.json
这个参数- f
并不是我们需要的,所以报错。而pycharm不会给上面这个奇怪的参数,所以相安无事。
而如果采用形式2,python系统不再读取,所以不会读入那个-f
参数。
解决方案
根据上面的原理,聪明的你应该想到了解决方案。
方法1
将parse_args()由形式1换成形式2。
最后一行换成:
import argparseparser = argparse.ArgumentParser(description="Deep Gaussian Processes on MNIST")
parser.add_argument("-n", "--num-epochs", default=5, type=int)
parser.add_argument("-t", "--num-iters", default=60, type=int)
parser.add_argument("-b", "--batch-size", default=1000, type=int)
parser.add_argument("-lr", "--learning-rate", default=0.01, type=float)args = parser.parse_args(args=[])
成功:
方法2
添加一个接受上面那个参数的语句。
import argparseparser = argparse.ArgumentParser(description="Deep Gaussian Processes on MNIST")
parser.add_argument("-n", "--num-epochs", default=5, type=int)
parser.add_argument("-t", "--num-iters", default=60, type=int)
parser.add_argument("-b", "--batch-size", default=1000, type=int)
parser.add_argument("-lr", "--learning-rate", default=0.01, type=float)parser.add_argument("-f","--file",default="file")#接收这个-f参数
args = parser.parse_args()
print(args.file)
不报错,输出如下:
C:\Users***\AppData\Roaming\jupyter\runtime\kernel-229ed901-2d6b-48ce-a402-fc5d3a697aea.json