【问题标题】:Python runtime determine which module to loadPython 运行时确定要加载的模块
【发布时间】:2016-05-07 15:00:09
【问题描述】:

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

(run_all_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_PC_A.py)

import <some module only available on PC A>

class MyTestCase(unittest.TestCase):
...

(foo_PC_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(...)

【问题讨论】:

    标签: python python-2.7 unit-testing import


    【解决方案1】:

    您可以欺骗 Python 使其认为模块已经加载。只需动态导入模块并使用sys.modules

    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'] = ...
    

    【讨论】:

      猜你喜欢
      • 2015-03-16
      • 2019-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-05
      • 2011-01-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多