我有在多台机器上运行的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
答案 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()