【问题标题】:Python subprocess.check_call terminate and start from where it terminatedPython subprocess.check_call 终止并从它终止的地方开始
【发布时间】:2015-04-09 06:28:46
【问题描述】:

我正在尝试使用 subprocess_check.call() 通过调用另一个带有输入和输出文件的 python 脚本来自动化一些测试用例。我有大约。 10 个输入文件。例如,当我开始测试时,第一个和第二个文件已成功测试,但在第三个文件中出现错误,脚本被终止。我想要的是,我怎样才能从它被终止的地方运行我的脚本?我不想从头开始。我只是想从出现错误的情况下继续我的测试。更正输入文件后,从这个文件开始我要运行脚本直到结束。

有什么想法吗?

【问题讨论】:

    标签: python subprocess terminate


    【解决方案1】:

    所以,这不是一个涉及代码的问题,所以你会得到一个一般性的答案,不涉及代码。

    您的问题的解决方案需要您遵守协议。此协议必须在您的测试过程的整个生命周期中都存在。

    所以,必须有一个地方可以写入你的测试状态,而且这个地方必须确保持久性。那可能是什么?对,例如文件系统。跟踪测试最简单的地方就是文件系统。

    下面是一个非常简单的示例,说明您可能希望如何实现这一点:对于每个成功的测试用例,将一个文件写入当前工作目录,表明该测试成功。然后,在您的测试过程调用某个测试之前,使其检查此类文件的存在,如果找到该文件,则使其跳过测试。假设您的输入文件具有不同的基本名称(例如AB、...)。然后,您可以在当前工作目录中使用一个名为 B.success 的文件来表明不再需要对其进行测试。

    【讨论】:

    • 感谢您的精彩解释!我明白了。
    • 如果答案有帮助,您可能需要考虑投票/检查它。谢谢!
    【解决方案2】:

    我想我有一个准系统的答案,不使用此任务的子流程(除非你真的必须这样做)。

    假设要测试的脚本格式为

    script1.py

    import sys
    
    def main1(args):
        #do something awesome with args
        return some_cool_value
    
    if __name__ == "__main__":
        filename = sys.argv
        main1(filename)
    

    那么你正在做的是使用 subprocess 来评估它的输出,当你可以做的是以下事情时:

    main_test.py

    from script1 import main1 # you may want to rename main is you have  loads of scripts
    
    def test__main(filenames):
         for name in filenames:
              try:
                  result1 = main1(name)
                  # do something with result
                  print "file "+ name+ " processed successfully!"
              except:
                  print "file "+ name+ " not processed successfully!"
    
    
    
    if __name__ == "__main__":
    
        filenames = sys.argv
        main(fienames)
    

    并记录哪些文件在处理时成功,因此您可以在必要时在正确的位置重新启动。

    我想象工作流程是这样的:

     python main_test.py passingfile1 corruptedfile2
    
     >>> file passingfile1 processed successfully
     >>> file corruptedfile2 not successfully processed 
    

    然后您可以从损坏的文件 2 重新运行您的脚本。

    一般我尽量避免使用子进程来调用python脚本,并且只在编译的二进制文件中使用它,当没有其他接口是可能的时候

    【讨论】:

    • 您的答案没有为自动跳过一组测试提供解决方案。手动评估日志文件和手动调整 Python 脚本不是有效的解决方案。您还应该在语义上清理您的代码:filename = sys.argv,真的吗?错字:main(fienames)。此外,您应该明白,在不同的进程中运行测试可以确保测试在一定程度上解耦——这在许多情况下可能是一个重要的要求,您无法判断他/她的要求。
    • 如果这很重要,您可以在不使用 subprocess 模块的情况下生成新进程。使用 subprocess 模块来运行现有的 python 脚本似乎很疯狂。我怀疑我应该清理代码,尽管它实际上只是一个想法的演示。按照您的建议编辑上述方法以将通过的测试写入文件非常容易
    猜你喜欢
    • 1970-01-01
    • 2021-03-13
    • 2014-12-19
    • 2011-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-29
    相关资源
    最近更新 更多