gpt4 book ai didi

python - 如何禁止在用 execfile 调用的脚本中执行语句?

转载 作者:行者123 更新时间:2023-11-28 22:56:19 26 4
gpt4 key购买 nike

标题中提出的问题可能是the XY-Problem的情况, 但我找不到更简洁的描述。我想通过在每个脚本上运行 execfile(filename) 来测试一些 python 脚本,然后查看它们是否触发断言/抛出异常。到目前为止一切顺利,但他们中的大多数还启动了一个 gui 以符合一个语句,比方说 world.show('someString')。对于自动化测试,我不想看到gui。如何在不更改脚本本身的情况下抑制 gui?

编辑:关于评论:本质上,我可以这样做:

import unittest

class TestExamples(unittest.TestCase):

def test_firstExample(self):
execfile('example1.py')

def test_secondExample(self):
execfile('example2.py')

# and many more

if __name__ == '__main__':
unittest.main()

但是 a) 有两个以上,我宁愿不为每个示例编写一个测试函数。我希望仅通过将它们放在文件夹中就可以对它们进行测试。这可以通过单元测试 discover 来解决。和 b),其中大多数以可视化计算结束,就像您使用 matplotlib.pyplot.show() 一样。我想在不更改示例本身的情况下抑制这种可视化。

最佳答案

这是一个相当简单的选项:假设您有一个像这样的文件 world.py...

def show(text):
return some_gui_stuff.confirm(text)

...然后创建一个新文件 fakeworld.py 如下所示...

def show(text):
return True

...然后在您的测试脚本中,执行类似...

import sys
sys.modules['world'] = __import__('fakeworld')
execfile('example1.py')

example1.py 尝试import world 时,它将使用您在测试脚本顶部导入的虚假版本。

这意味着您必须为 world.py 中的每个函数创建一个伪造的版本。如果有很多功能,但只有一两个需要更改,那么制作这样的测试脚本可能会更容易......

import world
import fakeworld
world.show = fakeworld.show
execfile('example1.py')

...或者如果 world.show 实际上是唯一的功能,您可能甚至不需要创建 fakeworld.py - 只需执行类似的操作即可。 ..

import world
world.show = lambda x: True
execfile('example1.py')

关于python - 如何禁止在用 execfile 调用的脚本中执行语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15849113/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com