导入自定义python模块..为什么只有一些元素会结转?

时间:2017-11-05 08:06:46

标签: python class import module argparse

我需要创建一个python模块,许多脚本最终需要从中导入:

  • 自定义arg解析以设置格式和常量args(即我的详细和帮助args,以及在脚本中视觉上令人愉悦/一致的所有内容)

我的自定义模块目前正在独立工作,我现在很满意,但我似乎无法将其正确地导入到另一个脚本中。该模块导入另一个模块(ver.py),定义一个简单的变量常量而没有任何问题(我希望只在一个位置存在一个版本代码)。但是当我尝试将该文件导入另一个文件(例如myexecutable.py)并添加用于解析其他参数的代码时,它会失败。另外,我在目录中有_ _init__.py,其中包含我正在使用的所有文件。

此代码发生了很大变化,我无法将其恢复到“部分工作”状态,但我可以让它没有错误。这不是什么错误:

#!/usr/bin/env python
import argparse
import par as pp  ##par.py is my working parsing code

pp.preq.add_argument('input', metavar=" INPUT.ext", type=argparse.FileType('rt'))
pp.preq.add_argument('output', metavar=" OUTPUT.ext", type=argparse.FileType('wt'))

值得注意的是,我希望在执行的文件中定义'description'和'usage',而不是导入的文件。以下是导入文件(par.py)的子集:

class USAGEformat(argparse.RawTextHelpFormatter):
        def add_usage(self, usage, actions, groups, prefix=None):
                if prefix is None:
                        prefix = 'nameconstant '+v.VERSION+'\n\nUSAGE:  '+prog
                super(USAGEformat, self).add_usage(usage, actions, groups, prefix)

parse = argparse.ArgumentParser(add_help=False, formatter_class=USAGEformat)

preq = parse.add_argument_group("___________________\n++ COMPULSORY ARGS")

当我尝试使用ArgumentParser添加更多内容时,它无法识别我的USAGEformat类。在某些时候,我让我的脚本部分识别它,并采用我定义的用法,但不是我定义的描述或强制参数。无法弄明白我做了什么..

为什么我的变量仅在简单导入时才起作用:

VERSION = "v1.0"

但不是当它们更复杂的时候,为什么我的课程也没有延续?我假设我错过了一些基本的理解,这是如何工作的,并没有弄清楚那是什么?我一直在用自己的教程/谷歌教这门语言,因为我不是计算机科学家,我会非常感谢。

1 个答案:

答案 0 :(得分:0)

您之前的问题和代码:

Fully customized Python Help Usage

使用import par as pp,必须使用pp.前缀访问该模块中定义的所有变量,类和函数。因此pp.parser是导入时创建的解析器对象。 pp.preq是参数组之一。

pp.USAGEformat是自定义格式化程序类。但是在创建parser时或导入par时,不会创建格式化程序,此类的对象。当您要求helpusage(' -h',pp.parser.print_help())时,会从指定的类创建格式化程序。

(编辑)这是错误的:

  
    

此格式化程序将从当前命名空间(导入的命名空间)中获取全局变量,如versionprog,而不是pp

  

格式化程序仍然从导入的命名空间中获取version。但我可以改变:

pp.version = '3.0'

(请参阅https://stackoverflow.com/a/47118317/901925中的编辑)

您可以通过更改文件末尾的pre并执行新的version来在print_help()中自行测试此行为。您会在显示屏上看到更改。

另一方面,

pp.parser是在导入时创建的。您可以修改pp.parser.description,即创建时设置的属性。设置或更改pp.description不会。

当您parser.print_help()时,它会调用parser.format_help,然后调用parser._get_formatter。该方法使用parser.formatter_class创建一个formatter对象,然后填充'并且'执行'。这种方法具有很大的灵活性,但可能令人困惑。