Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python,如何有单独的参数处理和主函数?_Python_Namespaces - Fatal编程技术网

Python,如何有单独的参数处理和主函数?

Python,如何有单独的参数处理和主函数?,python,namespaces,Python,Namespaces,如果我有两个这样的DEF: def handle_args(argv=None) . . . def main() . . . 我如何让程序主体包括: if __name__ == "__main__": handle_args(argv) main() 并且仍然允许main访问参数,并允许handle_args()访问argv 我当前的代码(我还没有测试过,我知道它是错误的,我仍在尝试破解它)是: 在ising.py文件中: import extra,sys globa

如果我有两个这样的DEF:

def handle_args(argv=None) 
.
.
.

def main()
.
.
.
我如何让程序主体包括:

if __name__ == "__main__":
    handle_args(argv)
    main()
并且仍然允许
main
访问参数,并允许
handle_args()
访问argv

我当前的代码(我还没有测试过,我知道它是错误的,我仍在尝试破解它)是:

在ising.py文件中:

import extra,sys
global argv
def main(argv=None):

    print('test')


if __name__ == "__main__":
    extra.handle_args(argv)
    main()
    sys.exit(main())
在extra.py文件中:

'''
ising -- 3D Ising Model Simulator

ising is a ising model simulator for three dimensional lattices. It has four built in lattice structures
corespodinging to iron, nickel, cobalt and a generic lattice.

@author:     Joseph "nictrasavios" Harrietha
@copyright:  2013 Joseph Harrietha. All rights reserved.
@license:    GNU GPL3
@contact:    nictrasavios@gmail.com
'''
import sys,os,argparse

__all__ = []
__version__ = 0.1
__date__ = '2013-12-20'
__updated__ = '2013-12-20'


def handle_args(argv=None): # IGNORE:C0111
    '''Command line options.'''

    if argv is None:
        argv = sys.argv
    else:
        sys.argv.extend(argv)

    program_name = os.path.basename(sys.argv[0])
    program_version = "v%s" % __version__
    program_build_date = str(__updated__)
    program_version_message = '%%(prog)s %s (%s)' % (program_version, program_build_date)
    program_shortdesc = __import__('__main__').__doc__.split("\n")[1]
    program_license = '''%s

    Created by Joseph "nictrasavios" Harrietha on %s.
    Copyright 2013 Joseph Harrietha. All rights reserved.

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.

USAGE
''' % (program_shortdesc, str(__date__))

    try:
        # Setup argument parser
        parser = argparse.ArgumentParser(description=program_license, formatter_class=argparse.RawDescriptionHelpFormatter)
        parser.add_argument("-v", "--verbose", dest="verbose", action="count", help="set verbosity level [default: %(default)s]")
        parser.add_argument('-V', '--version', action='version', version=program_version_message)
        parser.add_argument("-f", "--field", dest="field",default=1, help="Set the value of the magnetic feild. [default: %(default)s]")
        parser.add_argument("-t", "--temp", dest="temp",default=1, help="Set the value of the temperature in Kelvin. [default: %(default)s]")
        parser.add_argument("-l", "--side", dest="side",default=1, help="Set the width/height of the square latice. [default: %(default)s]")
        parser.add_argument("-j", "--excont", dest="excont",default=1, help="Set the value of the Exchange Constant. [default: %(default)s]")
        parser.add_argument("-d", "--data", dest="data",default=10**3, help="Set the number of points to plot for time evolution. [default: %(default)s]")
        parser.add_argument("-m", "--steps", dest="steps",default=10**3, help="Sets the number of Monte Carlo steps. [default: %(default)s]")
        # Process arguments
        args = parser.parse_args()
        verbose = args.verbose

        if verbose > 0:
            print("Verbose mode on")

    except KeyboardInterrupt:
        return 0
    except Exception:
        indent = len(program_name) * " "
        sys.stderr.write(program_name + ": " + repr(Exception) + "\n")
        sys.stderr.write(indent + "  for help use --help")
        return 2
“”
伊辛——三维伊辛模型模拟器
伊辛是一个三维晶格的伊辛模型模拟器。它有四个内置的格子结构
对铁、镍、钴和普通晶格的芯着色。
@作者:Joseph“nictrasavios”Harrietha
@版权所有:2013年约瑟夫·哈里塔。版权所有。
@许可证:GNU GPL3
@联系人:nictrasavios@gmail.com
'''
导入系统、操作系统、argparse
__全部
__版本=0.1
__日期='2013-12-20'
__更新的_uu='2013-12-20'
def句柄参数(argv=None):#忽略:C0111
''命令行选项''
如果argv为None:
argv=sys.argv
其他:
系统argv.extend(argv)
program_name=os.path.basename(sys.argv[0])
程序版本=“v%s”%\u版本__
程序\u构建\u日期=str(\u更新\u)
程序版本消息='%%(程序)s%s(%s)'(程序版本,程序生成日期)
程序\u shortdesc=\u导入\u(“\u主\u”)。\u文档\u.split(“\n”)[1]
程序许可证=“”“%s”
由Joseph“nictrasavios”Harrietha在%s上创建。
版权所有2013 Joseph Harrietha。版权所有。
此程序是免费软件:您可以重新发布和/或修改它
它是根据GNU通用公共许可证的条款发布的
自由软件基金会,或者许可证的第3版,或者
(由您选择)任何更高版本。
这个节目的发布是希望它会有用,
但无任何保证;甚至没有任何关于
适销性或适合某一特定目的。见
有关更多详细信息,请参阅GNU通用公共许可证。
您应该已经收到GNU通用公共许可证的副本
和这个节目一起。如果没有,请参阅。
用法
“%”(程序短描述,str(uuu日期))
尝试:
#设置参数解析器
parser=argparse.ArgumentParser(description=program\u license,formatter\u class=argparse.RawDescriptionHelpFormatter)
parser.add_参数(“-v”、“--verbose”、dest=“verbose”、action=“count”、help=“设置详细级别[默认值:%(默认值)s]”)
parser.add_参数('-V','-version',action='version',version=program_version_消息)
parser.add_参数(“-f”,“--field”,dest=“field”,default=1,help=“设置磁场的值。[默认值:%(默认值)s]”)
parser.add_参数(“-t”,““--temp”,dest=“temp”,default=1,help=“设置以开尔文为单位的温度值。[默认值:%(默认值)s]”)
parser.add_参数(“-l”,“--side”,dest=“side”,default=1,help=“设置正方形的宽度/高度。[默认值:%(默认值)s]”)
parser.add_参数(“-j”,“--excont”,dest=“excont”,default=1,help=“设置交换常量的值。[默认值:%(默认值)s]”)
parser.add_参数(“-d”,“--data”,dest=“data”,default=10**3,help=“设置绘制时间演化的点数。[默认值:%(默认值)s]”)
parser.add_参数(“-m”,““--steps”,dest=“steps”,default=10**3,help=“设置蒙特卡洛步数。[默认值:%(默认值)s]”)
#过程参数
args=parser.parse_args()
verbose=args.verbose
如果详细>0:
打印(“详细模式打开”)
除键盘中断外:
返回0
除例外情况外:
缩进=长度(程序名称)*“
sys.stderr.write(程序名+“:”+repr(异常)+“\n”)
sys.stderr.write(缩进+“用于帮助使用--help”)
返回2

可能您的
handle\u argv
函数应该以其他代码可以使用的格式返回解析后的参数。目前,您正在返回某种类型的整数错误代码,这不是非常符合Python的(而且您甚至不存储或检查该值)

所以,我会这样做:

import sys

def handle_argv(argv=None):
    if argv is None:
        argv = sys.argv

    # do your parsing here, and don't bother catching exceptions

    return args

def main(args):
    # do whatever, reading args as necessary

if __name__ == "__main__":
    args = handle_argv(sys.argv)
    main(args)

如果您想将
handle_argv
功能移动到另一个模块,则无需更改任何其他内容(只需导入模块并使用
whateverthemodules.handle_argv(sys.argv)
您可以尝试使用
optparser

from optparse import OptionParser

def handle_argv():
    parser = OptionParser()
    parser.add_option("-u", "--url", dest="url",
                       help="Url to start crawl with")

    options, args = parser.parse_args()
    return options

def main():
    options = handle_argv()
    url = options.url
    print url

main()

或者,如果您想成为未来的证明,请使用,我发现在我遇到的所有用例中,它都远远优于optparse。