我在文件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)
答案 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
名称空间。