如何创建一个内联modu

2024-10-01 07:37:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个在多台机器上运行的python项目。我使用virtualv跨python模块同步多个模块。这个很好用。不过,我把一些内部烘焙的SWIG*.so的包也拉进了env。这些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 在

^{pr2}$

那么,python中的“如何在line中定义模块”?在

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

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

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

Tags: 模块oftheto代码import机器so
2条回答

如果我没听错,你想在编译后的模块不能被导入时“模仿”它吗?在

因此,如果您的swigsubpackagebar中有:

swigsubpackagebar.aFunc(aString) -> outString

然后您需要一个“mock”模块来支持同一个接口,但不做任何事情。在

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

^{pr2}$

然后将导入语句的结构如下:

## 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()

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

相关问题 更多 >