我需要创建一个python模块,许多脚本最终需要从中导入:
我的自定义模块目前正在独立工作,我现在很满意,但我似乎无法将其正确地导入到另一个脚本中。该模块导入另一个模块(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"
但不是当它们更复杂的时候,为什么我的课程也没有延续?我假设我错过了一些基本的理解,这是如何工作的,并没有弄清楚那是什么?我一直在用自己的教程/谷歌教这门语言,因为我不是计算机科学家,我会非常感谢。
答案 0 :(得分:0)
您之前的问题和代码:
Fully customized Python Help Usage
使用import par as pp
,必须使用pp.
前缀访问该模块中定义的所有变量,类和函数。因此pp.parser
是导入时创建的解析器对象。 pp.preq
是参数组之一。
pp.USAGEformat
是自定义格式化程序类。但是在创建parser
时或导入par
时,不会创建格式化程序,此类的对象。当您要求help
或usage
(' -h',pp.parser.print_help()
)时,会从指定的类创建格式化程序。
(编辑)这是错误的:
此格式化程序将从当前命名空间(导入的命名空间)中获取全局变量,如
version
和prog
,而不是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
对象,然后填充'并且'执行'。这种方法具有很大的灵活性,但可能令人困惑。