Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/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
在unittest python中解析命令行参数_Python_Argparse_Python Unittest - Fatal编程技术网

在unittest python中解析命令行参数

在unittest python中解析命令行参数,python,argparse,python-unittest,Python,Argparse,Python Unittest,我正在使用unittest模块用python创建一个测试用例 我确实创建了一个解析参数列表,我想从用户那里得到它。 但当我在执行python脚本时使用该参数时,它会给出错误:option-i not recognized 用法:testing.py[选项][测试][…] 代码段: class Testclass(unittest.TestCase): @classmethod def setUpClass(cls): print "Hello Class"

我正在使用unittest模块用python创建一个测试用例

我确实创建了一个解析参数列表,我想从用户那里得到它。 但当我在执行python脚本时使用该参数时,它会给出错误:option-i not recognized 用法:testing.py[选项][测试][…]

代码段:

class Testclass(unittest.TestCase):

    @classmethod
    def setUpClass(cls):
        print "Hello Class"

    def test_addnum(self):
        print "Execute the test case"
        #parser = parse_args(['-i'])
        print 'simple_value     =', args.inputfile

    def parse_args():
        parser = argparse.ArgumentParser()
        parser.add_argument('-i', help='input file', dest='inputfile')
        ns, args = parser.parse_known_args(namespace=unittest)
        #args = parser.parse_args()
        return ns, sys.argv[:1] + args

if __name__ == '__main__':
    unittest.main()
使用-i somefile.txt执行上述脚本时出现的错误是:


任何帮助都将不胜感激。

您的代码正在使用

argparse.ArgumentParser()
parser.add_argument('-i', help='input file', dest='inputfile')
在测试类的方法中。但是我看不到代码实际上正在调用该方法的迹象

因此,在启动程序时,解析器还不存在,因为还没有调用TestClass.parse_args方法


将解析器的创建及其参数的规范移出类,以便代码在程序启动时调用它

您的代码正在使用

argparse.ArgumentParser()
parser.add_argument('-i', help='input file', dest='inputfile')
在测试类的方法中。但是我看不到代码实际上正在调用该方法的迹象

因此,在启动程序时,解析器还不存在,因为还没有调用TestClass.parse_args方法

将解析器的创建及其参数的规范移出类,以便代码在程序启动时调用它

您正在运行unittest.main作为主程序。所以它有理由抱怨它不知道你写的选项:

"option -i not recognized"
如果您想创建自己的测试套件启动器,您应该研究

您正在运行unittest.main作为主程序。所以它有理由抱怨它不知道你写的选项:

"option -i not recognized"
如果您想创建自己的测试套件启动器,您应该研究

此脚本捕获-i命令,同时仍然允许unittest.main执行自己的命令行解析:

import unittest

class Testclass(unittest.TestCase):

    @classmethod
    def setUpClass(cls):
        print "Hello Class"

    def test_addnum(self):
        print "Execute the test case"
        #parser = parse_args(['-i'])
        print 'simple_value     =', args.inputfile

import argparse
def parse_args():
    parser = argparse.ArgumentParser()
    parser.add_argument('-i', help='input file', dest='inputfile')
    ns, args = parser.parse_known_args(namespace=unittest)
    #args = parser.parse_args()
    return ns, sys.argv[:1] + args

if __name__ == '__main__':
    import sys
    args, argv = parse_args()   # run this first
    print(args, argv)
    sys.argv[:] = argv       # create cleans argv for main()
    unittest.main()
产生:

1113:~/mypy$ python stack44236745.py -i testname -v
(<module 'unittest' from '/usr/lib/python2.7/unittest/__init__.pyc'>, ['stack44236745.py', '-v'])
Hello Class
test_addnum (__main__.Testclass) ... Execute the test case
simple_value     = testname
ok

----------------------------------------------------------------------
Ran 1 test in 0.000s
OK
它看起来相当笨拙,但似乎确实有效

其思想是首先运行您自己的解析器,捕获-i输入,然后将其余的放回sys.argv。您对parse_args的定义表明您已经在尝试这样做了

此脚本捕获-i命令,同时仍允许unittest.main执行自己的命令行解析:

import unittest

class Testclass(unittest.TestCase):

    @classmethod
    def setUpClass(cls):
        print "Hello Class"

    def test_addnum(self):
        print "Execute the test case"
        #parser = parse_args(['-i'])
        print 'simple_value     =', args.inputfile

import argparse
def parse_args():
    parser = argparse.ArgumentParser()
    parser.add_argument('-i', help='input file', dest='inputfile')
    ns, args = parser.parse_known_args(namespace=unittest)
    #args = parser.parse_args()
    return ns, sys.argv[:1] + args

if __name__ == '__main__':
    import sys
    args, argv = parse_args()   # run this first
    print(args, argv)
    sys.argv[:] = argv       # create cleans argv for main()
    unittest.main()
产生:

1113:~/mypy$ python stack44236745.py -i testname -v
(<module 'unittest' from '/usr/lib/python2.7/unittest/__init__.pyc'>, ['stack44236745.py', '-v'])
Hello Class
test_addnum (__main__.Testclass) ... Execute the test case
simple_value     = testname
ok

----------------------------------------------------------------------
Ran 1 test in 0.000s
OK
它看起来相当笨拙,但似乎确实有效


其思想是首先运行您自己的解析器,捕获-i输入,然后将其余的放回sys.argv。您对parse_args的定义表明您已经在尝试这样做了

谢谢你,你的解决方案真的帮了我的忙,我又找到了一个解决这个问题的方法。希望它能帮助其他面临同样问题的人

import unittest
import argparse
import sys

class Testclass(unittest.TestCase):

    @classmethod
    def setUpClass(cls):
        print "Hello Class"

    def test_addnum(self):
        print "Execute the test case"
        #parser = parse_args(['-i'])
        print 'simple_value     =', args.inputfile

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('-i', help='input file', dest='inputfile')
    parser.add_argument('unittest_args', nargs='*')
    args = parser.parse_args()
    sys.argv[1:] = args.unittest_args
    unittest.main()
现在使用选项-i as python testing.py-i somefile.txt执行脚本,结果如下

Hello Class
Execute the test case
simple_value     = somefile.txt
.
----------------------------------------------------------------------
Ran 1 test in 0.000s

OK

谢谢hpaulj,你的解决方案真的帮助了我,我又找到了一个解决这个问题的方法。希望它能帮助其他面临同样问题的人

import unittest
import argparse
import sys

class Testclass(unittest.TestCase):

    @classmethod
    def setUpClass(cls):
        print "Hello Class"

    def test_addnum(self):
        print "Execute the test case"
        #parser = parse_args(['-i'])
        print 'simple_value     =', args.inputfile

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('-i', help='input file', dest='inputfile')
    parser.add_argument('unittest_args', nargs='*')
    args = parser.parse_args()
    sys.argv[1:] = args.unittest_args
    unittest.main()
现在使用选项-i as python testing.py-i somefile.txt执行脚本,结果如下

Hello Class
Execute the test case
simple_value     = somefile.txt
.
----------------------------------------------------------------------
Ran 1 test in 0.000s

OK

您还可以粘贴脚本中的相关部分吗?这是我只想执行的脚本,但当我使用选项-i somefile.txt执行它时,它会将错误作为选项-我无法识别。如果您需要帮助,您需要显示什么不起作用。你的测试很有效。你希望人们猜测你的代码为什么不起作用吗?也许我们的速度不一样。嗯,这是我试图从用户那里获取参数的示例代码,我想在我的testcase add_num中打印它。所以我尝试了这段代码,并使用python testing.py-i somefile.cunittest.main运行它自己的argparse或等效的解析器来执行它。这就是反对-i命令的人。它甚至没有达到运行您的测试用例的目的。您还可以从脚本中粘贴相关部分吗?这是我只想执行的脚本,但是当我使用选项-i somefile.txt执行它时,它会将错误作为选项-我无法识别。但是,如果您需要帮助,您需要显示什么不起作用。你的测试很有效。你希望人们猜测你的代码为什么不起作用吗?也许我们的速度不一样。嗯,这是我试图从用户那里获取参数的示例代码,我想在我的testcase add_num中打印它。所以我尝试了这段代码,并使用python testing.py-i somefile.cunittest.main运行它自己的argparse或等效的解析器来执行它。这就是反对-i命令的人。它甚至没有达到运行测试用例的目的。即使将行放在方法之外,也放在类之外,在这两种情况下,它给出了相同的错误。您的代码是否可能设置了另一个不识别-i的解析器?我已经在问题本身中发布了确切的错误。即使在将行置于方法之外和类之外,在这两种情况下,它给出了相同的错误。您的代码是否可能设置了另一个不识别-i的解析器?我有
发布了问题本身的确切错误。谢谢hpaulj,它成功了。是的,它看起来很糟糕,但我又找到了一个解决办法。希望这两种解决方案都能帮助其他面临同样问题的人。再次发布回复感谢hpaulj,它成功了。是的,它看起来很糟糕,但我又找到了一个解决办法。希望这两种解决方案都能帮助其他面临同样问题的人。再次发布作为答复