1

複数のマシンで実行される python プロジェクトがあります。複数のマシン間でpythonモジュールを同期するためにvirtualenvを使用しています。これはうまくいきます。ただし、社内で焼いた 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

注: モジュールが *.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 に答える