如何创建内联模块

时间:2012-12-15 02:09:06

标签: python python-2.7

我有在多台机器上运行的python项目。我正在使用virtualenv来跨多台机器同步python模块。这非常有效。不过,我正在将一些内部烤制的SWIG * .so的包装入env。这些c ++共享对象有一些影响深远的依赖性恶梦,很难在某些机器上重现。我不需要在一些开发机器上有代码功能。我想继续加载python代码并继续摇摇而不做修改。

我想在没有模块的机器上加载'假冒模块'。我不会调用实际运行SWIG * .so方法的代码。

示例:

try:
   import swigpackagefoo.swigsubpackagebar
except ImportError:
   # magic code that defines the fake module, I want to define a bunch of class'es with 'pass'
   # so all the code deps would be happy. and I dont require the swig *.so to 
   # be installed on the devel system.
   # something along the lines of.
   __import__('swigpackagefoo.swigsubpackagebar')=class foo(object): pass

注意:我认为值得注意的是当模块在prod机器上导入* .so时

type(swigpackagefoo)
# is 'module', also the 
type(swigpackagefoo.swigsubpackagebar)
# is also 'module'

所以'如何在python中定义模块化?'

我不想在缺少的开发机器上创建包

:我不想创建这些文件,因为系统上的模块冲突起作用。

$ tree
  swigpackagefoo/__init__.py
  swigpackagefoo/swigsubpackagebar/__init__.py

2 个答案:

答案 0 :(得分:2)

如果我理解正确,你希望能够"模拟"已编译的模块是否无法导入?

所以如果你的swigsubpackagebar有:

swigsubpackagebar.aFunc(aString) -> outString

然后你会想要一个" mock"模块支持相同的接口,但不做任何事情。

不要试图通过一些动态模块定义来解决这个问题,而是定义另一个提供所需接口的模块:

## swigMock.py ##
def aFunc(aString):
    return aString

然后构造你的import语句:

## main.py ##
try:
   import swigpackagefoo.swigsubpackagebar as swigModule
except ImportError:
   import swigMock as swigModule

print swigModule.aFunc("FOO")

如果swigsubpackagebar实际上是一个类,它的概念几乎相同:

## swigMock.py ##
class swigsubpackagebar(object):
    pass

再次使用as关键字将其命名为:

## main.py ##
try:
   import swigpackagefoo.swigsubpackagebar as swigClass
except ImportError:
   import swigMock.swigsubpackagebar as swigClass

aClass = swigClass()

答案 1 :(得分:0)

是的,可以的!

import sys
import types

my_module = types.ModuleType('my_module')
sys.modules['my_module'] = my_module
my_code = '''
def f():
    print('my_module.f says hello')
'''
exec(my_code, my_module.__dict__)
my_module.f()

来源: How to load a module from code in a string?