Python运行时决定加载哪个模块

2024-04-26 02:24:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我的Python单元测试脚本如下所示。它使用参数“-a”来确定测试用例是应该从foo_PC_A.py还是foo_PC_B.py加载基本模块。我使用shutil.move()将其中一个.py文件重命名为foo.py,因此所有的testcase模块(例如tm1.pytm2.py)都可以简单地import foo。虽然这看起来像一个解决办法,而不是Python。有没有更好的办法?或者更好的设计从根本上解决这个问题

(运行\u all \u unittest.py)

if sys.argv[1] = '-a':
  shutil.move('foo_PC_A.py', 'foo.py')
else:
  shutil.move('foo_PC_B.py', 'foo.py')


test_module_list = ['tm1', 'tm2', ...]
for test_module_name in test_module_list:
  test_module = __import__(test_module_name)
  test_suites.append(unittest.TestLoader().loadTestsFromModule(test_module))

alltests = unittest.TestSuite(test_suites)
unittest.TextTestRunner().run(alltests)

if sys.argv[1] = '-a':
  shutil.move('foo.py', 'foo_PC_A.py')
else:
  shutil.move('foo.py', 'foo_PC_B.py')

(tm1.py)

from foo import MyTestCase
...

(foo\u PC\u A.py)

import <some module only available on PC A>

class MyTestCase(unittest.TestCase):
...

(foo\u PC\u B.py)

# since the PC A modules are not available on PC B, 
# just call the pre-built executable via subprocess
import subprocess
class MyTestCase(unittest.TestCase):
...
  def test_run(self):
        subprocess.call(...)

Tags: 模块pytestimportmoveiffoounittest
1条回答
网友
1楼 · 发布于 2024-04-26 02:24:06

您可以欺骗Python,使其认为模块已经加载。只需动态导入模块并使用^{}

import sys
import importlib

if sys.argv[1] = '-a':
    sys.modules['foo'] = importlib.import_module('foo_PC_A')
else:
    sys.modules['foo'] = importlib.import_module('foo_PC_A')

当任何模块运行import foofrom foo import ...时,Python将使用该路径

请注意,如果foo被移动到包中,则必须指定完整的Python路径,如下所示:

sys.modules['path.to.foo'] = ...

相关问题 更多 >