複数のマシンで実行される 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