今天在写代码的时候遇到了一个关于parser的一些小坑,记录在此备用。

我们知道在python中可以用argprase来传递一些参数给代码执行,来看下面的例子,假设现在有一个test文件夹,下面有3个python文件,分别用a.py;b.py;c.py来表示,目录树如下。

每一个的初始代码为一个简单的print函数。

 #a.py
def out_a():
print("I am a.py") if __name__ == '__main__':
out_a()
 #b.py
def out_b():
print("I am b.py") if __name__ == '__main__':
out_b()
 #c.py
def out_c():
print("I am c.py") if __name__ == '__main__':
out_c()

现在在a.py中引入模块argprase,并定义一些简单的参数,代码如下

 import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--first_parameter', default='first')
parser.add_argument('--second_parameter', default='second')
parser.add_argument('--third_flag', action='store_true')
args = parser.parse_args() def out_a():
print("I am a.py") if __name__ == '__main__':
out_a()

这里面简单说一下第3个参数,这也是我今天想记录文章的原因,这个参数是argparse里面提供的开关布尔选项,actions记录的是一个动作,意味着在调用这个函数的时候,如果在命令行添加这个参数,则该参数为True,如果不添加这个参数,则该参数为False,归纳起来为如下的两个图。

这个是没有指定第3个参数的情况

这个是指定第3个参数的情况

对于这种开关布尔选项更为详细的介绍,可以参考知乎问题:Argparse中action的可选参数store_true,store_false到底是什么意思?

到目前为止没有出现问题,接下来,我希望b.py也使用参数,并且还希望使用a.py里面的函数,因此我对b.py进行如下修改。

 from a import out_a
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--fourth_parameter', default='fourth')
parser.add_argument('--fifth_parameter', default='fifth')
parser.add_argument('--sixth_flag', action='store_true')
args = parser.parse_args() def out_b():
print("I am b.py") if __name__ == '__main__':
out_b()
out_a()

然后同样的,我们分别用两种方式来测试b.py,效果如下。

这个是不使用参数的情况

这个是使用参数的情况

可以看到报错了,当时我看到这里的时候想了很久,排除了拼写错误的情况以后,观察这里面的输出,发现看到的是a.py当中的3个参数,而不是b.py当中设置的参数,于是我将a.py和b.py的参数表打印出来,看到这样子的结果。

输出两个python文件的参数表

可以发现尽管我使用的是 from a import out_a ,但依然引入了a.py当中的参数表,并且后引入的b.py的参数表没有办法覆盖掉。下面在c.py中同样引入3个参数,然后引入b.py的方法,代码如下:

 from b import out_b
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--seventh_parameter', default='seventh')
parser.add_argument('--eighth_parameter', default='eighth')
parser.add_argument('--ninth_flag', action='store_true')
args = parser.parse_args()
print(args) def out_c():
print("I am c.py") if __name__ == '__main__':
out_c()
out_b()

效果如下

不使用任何参数调用c.py

看到有3个参数列表输出就知道c.py的参数也是无效的了,验证一下。

使用参数调用c.py

解决方案:

其实只需要将所有的参数表放到同一个文件里面就可以了,比如utils.py,由于这里是同一个文件夹下的3个文件,在import调用的时候就只需要初始化一次所有参数就可以使用了,有点类似于C语言当中的全局变量,因为这个东西排查了一个下午,也是有点恼火了。

python中关于传递参数模块argprase的一些小坑的更多相关文章

  1. 深入理解python中函数传递参数是值传递还是引用传递

    深入理解python中函数传递参数是值传递还是引用传递 目前网络上大部分博客的结论都是这样的: Python不允许程序员选择采用传值还是传 引用.Python参数传递采用的肯定是"传对象引用 ...

  2. Python中函数传递参数有四种形式

    Python中函数传递参数有四种形式 fun1(a,b,c) fun2(a=1,b=2,c=3) fun3(*args) fun4(**kargs) 四种中最常见是前两种,基本上一般点的教程都会涉及, ...

  3. Python中os和shutil模块实用方法集…

    Python中os和shutil模块实用方法集锦 类型:转载 时间:2014-05-13 这篇文章主要介绍了Python中os和shutil模块实用方法集锦,需要的朋友可以参考下 复制代码代码如下: ...

  4. Python中os和shutil模块实用方法集锦

    Python中os和shutil模块实用方法集锦 类型:转载 时间:2014-05-13 这篇文章主要介绍了Python中os和shutil模块实用方法集锦,需要的朋友可以参考下 复制代码代码如下: ...

  5. python中的第三方日志模块logging

    基本上每个系统都有自己的日志系统,可以使自己写的,也可以是第三方的.下面来简单介绍一下python中第三方的日志模块,入手还是比较简单的,但是也很容易给自己埋雷. 下面是我参考的资料链接 入手demo ...

  6. Python中xlrd和xlwt模块使用方法 (python对excel文件的操作)

    本文主要介绍可操作excel文件的xlrd.xlwt模块.其中xlrd模块实现对excel文件内容读取,xlwt模块实现对excel文件的写入. 安装xlrd和xlwt模块 xlrd和xlwt模块不是 ...

  7. python 中函数的参数

    一.python中的函数参数形式 python中函数一般有四种表现形式: 1.def function(arg1, arg2, arg3...) 这种是python中最常见的一中函数参数定义形式,函数 ...

  8. python args kwargs 传递参数的区别

    先来看个例子: def foo(*args, **kwargs): print 'args = ', args print 'kwargs = ', kwargs print '----------- ...

  9. python中根据字符串导入模块module

    python中根据字符串导入模块module 需要导入importlib,使用其中的import_module方法 import importlib modname = 'datetime' date ...

随机推荐

  1. Docker学习のDocker中部署静态页网站

    前言:部署一个静态页网站,我们需要 常见映射80端口的交互式容器 安装Nginx(或其他服务器) 安装文本编辑器vim 创建静态页面 修改Ngnix的配置文件 运行Ngnix 验证网站的防高温 一.设 ...

  2. JS对象 Array 数组对象 数组对象是一个对象的集合,里边的对象可以是不同类型的。数组的每一个成员对象都有一个“下标”,用来表示它在数组中的位置,是从零开始的

    Array 数组对象 数组对象是一个对象的集合,里边的对象可以是不同类型的.数组的每一个成员对象都有一个"下标",用来表示它在数组中的位置,是从零开始的 数组定义的方法: 1. 定 ...

  3. javascript小技巧-js小技巧收集(转)

    本文转载自:http://blog.csdn.net/ocean20/article/details/2498699 每一项都是js中的小技巧,但十分的实用! 1.document.write(&qu ...

  4. cf1147

    C——筛法 #include<bits/stdc++.h> using namespace std; ]; int main(){ cin>>n; ; ;i<=n;i++ ...

  5. Duilib中各个类的简单介绍

    DirectUI意为直接在父窗口上绘图(Paint on parent dc directly).即子窗口不以窗口句柄的形式创建(windowless),只是逻辑上的窗口,绘制在父窗口之上.微软的“D ...

  6. 二分查找总结及部分Lintcode题目分析 2

    Search in a big sorted array,这个比之前的二分法模板多了一个很不同的特性,就是无法知道一个重要的条件end值,也是题目中强调的重点 The array is so big ...

  7. Integer 类和 int 基本数据类型的区别

    public static void main(String[] args) { Integer i = 10; Integer j = 10; System.out.println(i == j); ...

  8. js中一个标签在按顺序执行没有被读取到时可以用window.onload

    <%@LANGUAGE="JAVASCRIPT" CODEPAGE="65001"%> <!DOCTYPE html PUBLIC " ...

  9. scrapy运行的整个流程

    Spiders: 负责处理所有的response,从这里面分析提取数据,获取Item字段所需要的数据,并将需要跟进的URL提交给引擎,再次进入到Scheduler调度器中 Engine: 框架的核心, ...

  10. Hibernate的多对一映射

    一.创建Java工程,新建Lib文件夹,加入Hibernate和数据库(如MySql.Oracle.SqlServer等)的Jar包,创建 hibernate.cfg.xml 文件,并配置,配置项如下 ...