如何从交互式解释器调用函数并为argparse传递参数?

时间:2019-04-05 21:45:46

标签: python arguments command line argparse

我在文件myFunc中定义了一个Python函数test.py。我想以交互方式从Python解释器测试此功能,并将其传递给argparse解析的命令行参数。在Python解释器中,输入from test import myFunc。然后,我希望能够在交互模式下运行“ myFunc” ...但是将几个命令行参数传递给它。

例如,我尝试过myFunc() arg1 arg2,但是Python解释器报告了SyntaxError:无效的语法。

如果我只是键入myFunc(),该函数便会运行,但当然不会传递任何参数。

我意识到我可以在代码中包含以下内容...

if __name__ == "__main__":
    myFunc()

然后我可以从命令行“ python test.py arg1 arg2”运行 这确实有效。

但是我想知道是否可以在交互模式下从Python解释器测试myFunc()函数并将其传递给argparse解析的命令行参数。

import argparse
from textwrap import dedent
import sys

def myFunc():
    print "hello!"
    print str(sys.argv)

    parser = argparse.ArgumentParser(prog='Prog',
                                     formatter_class= argparse.RawTextHelpFormatter,
                                     description = dedent('Program to control Tycon TDDin2 Relay states'))
    parser.add_argument('addr',
                        help='ip[:port] address of target device. ' \
                        'Port defaults to the snmp port of 161.')
    parser.add_argument('relay',type=str, help='name of relay')
    parser.add_argument('action', type=str, help='action = Open, Close or Cycle')
    args = parser.parse_args()

    print('args = ' + args.addr + ' ' + args.relay + ' ' + args.action)

3 个答案:

答案 0 :(得分:1)

parse_args获取要解析的字符串列表;此参数的默认值为sys.argv[1:](实际上是None,将被解释为使用sys.argv[1:]的请求)。将相同的参数添加到myFunc,以直接传递到parse_args

def myFunc(cli_args=None):
    ...

    args = parser.parse_args(cli_args)
    print('args = ' + args.addr + ' ' + args.relay + ' ' + args.action)

现在,您可以使用所需的任意参数列表来调用myFunc

myFunc(["192.0.2.24", "foo", "Open"])

请记住,如果无法成功解析args列表(而不仅仅是引发自定义异常),parse_args会有效地退出解释器,因此您将准备好捕获{{ 1}}例外。

答案 1 :(得分:1)

无需修改myFunc,就可以在交互模式下修改sys.argv,调用函数时将对其进行解析:

sanyash@sanyash-ub16:~/myrepos/trash$ python2.7
Python 2.7.12 (default, Dec  4 2017, 14:50:18) 
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import file
>>> import sys
>>> sys.argv = ['./file.py', 'some addr', 'some relay', 'some action']
>>> file.myFunc()
hello!
['./file.py', 'some addr', 'some relay', 'some action']
args = some addr some relay some action
>>> 

答案 2 :(得分:0)

在迭代的ipython控制台会话中,我可以复制(n-粘贴)您的功能(进行一些更改)并轻松对其进行测试。

def myFunc(argv=None):
    parser = argparse.ArgumentParser(prog='Prog',
       formatter_class= argparse.RawTextHelpFormatter,
       description = 'Program to control Tycon TDDin2 Relay states')
    parser.add_argument('addr',
                        help='ip[:port] address of target device. ' \
                        'Port defaults to the snmp port of 161.')
    parser.add_argument('relay',type=str, help='name of relay')
    parser.add_argument('action', type=str, help='action = Open, Close or Cycle')
    args = parser.parse_args(argv)
    return args

测试空命令行:

In [7]: myFunc([])                                                              
usage: Prog [-h] addr relay action
Prog: error: the following arguments are required: addr, relay, action
An exception has occurred, use %tb to see the full traceback.

SystemExit: 2

/usr/local/lib/python3.6/dist-packages/IPython/core/interactiveshell.py:3299: UserWarning: To exit: use 'exit', 'quit', or Ctrl-D.
  warn("To exit: use 'exit', 'quit', or Ctrl-D.", stacklevel=1)

ipython捕获出口。

myFunc()将查看sys.argv;产生相同的错误消息,因为我的会话命令行与此解析器无关。

测试帮助:

In [8]: myFunc(['-h'])                                                          
usage: Prog [-h] addr relay action

Program to control Tycon TDDin2 Relay states

positional arguments:
  addr        ip[:port] address of target device. Port defaults to the snmp port of 161.
  relay       name of relay
  action      action = Open, Close or Cycle

optional arguments:
  -h, --help  show this help message and exit
An exception has occurred, use %tb to see the full traceback.

SystemExit: 0
....

使用有效列表进行测试:

In [9]: myFunc(['testpy','arg1','arg2'])                                        
Out[9]: Namespace(action='arg2', addr='testpy', relay='arg1')

这将显示函数返回的args名称空间。