1

我有在多台机器上运行的 python 项目。我正在使用 virtualenv 在多台机器上同步 python 模块。这很好用。但是,我也将一些内部烘焙的 SWIG *.so 包引入环境。这些 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

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

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

那么'如何在python中定义一个模块在线'?

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

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

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

2 回答 2

2

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

所以,如果swigsubpackagebar你有:

swigsubpackagebar.aFunc(aString) -> outString

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

不要试图通过一些即时模块定义来解决这个问题,只需定义另一个提供您想要的接口的模块:

## 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()
于 2012-12-15T02:27:12.550 回答
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()

来源: 如何从字符串中的代码加载模块?

于 2018-10-31T08:54:01.180 回答