Python 如何创建内嵌模块

Python 如何创建内嵌模块,python,python-2.7,Python,Python 2.7,我有一个在多台机器上运行的python项目。我正在使用virtualenv跨多台机器同步python模块。这很有效。然而,我正在把一些内部烘焙的饮料*。so的包装也放进环境中。这些C++共享对象具有一些深远的依赖性噩梦,这些噩梦在某些机器上难以再现。我不需要在一些devel机器上有代码功能。我希望能够加载python代码的其余部分,并在不进行修改的情况下继续运行 我想在没有模块的机器上“伪造模块”加载。我不会调用实际执行SWIG*.so方法的代码 例如: try: import swigp

我有一个在多台机器上运行的python项目。我正在使用virtualenv跨多台机器同步python模块。这很有效。然而,我正在把一些内部烘焙的饮料*。so的包装也放进环境中。这些C++共享对象具有一些深远的依赖性噩梦,这些噩梦在某些机器上难以再现。我不需要在一些devel机器上有代码功能。我希望能够加载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时

那么,在python中“如何定义行中的模块”呢

我不想在丢失的devel机器上创建包

i、 e:我不想创建这些文件,因为工作系统上存在模块冲突

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

如果我理解正确,如果无法导入编译后的模块,您希望能够“模拟”该模块吗

因此,如果在您的
swigsubpackagebar
中有:

swigsubpackagebar.aFunc(aString) -> outString
然后,您可能希望一个“mock”模块支持相同的接口,但不做任何事情

与其尝试使用一些动态模块定义来解决此问题,不如定义另一个提供所需接口的模块:

## swigMock.py ##
def aFunc(aString):
    return aString
然后按如下方式构造导入语句:

## 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()
是的,你可以

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()
资料来源:

为什么您不能在例外条款中传递?如果这些模块无论如何都不会被使用,那么您甚至不需要名称空间中具有该名称的对象。另一个选择是填充一个与模块布局相同的类。感谢“Justin”,我按照您的方法为缺少的python模块创建了模拟类。它工作得很好,是我为特定方法调用伪造数据的好方法。
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()