この質問は、次のものと似ています。
少しひねるだけです。ここでは、2 つの C-ext を混在させようとしているのではなく、代わりに 1 つの C-ext と通常の python サブモジュールを混在させようとしています。
C拡張がシンボル「module.so」とサブモジュールに存在するものとの間でモジュールの名前空間を共有する方法はありますか?
私のモジュール構造は次のようになります。
facs/
facs/
__init__.py
setup.py
facs.so
[*.c files]
utils/
__init__.py
galaxy.py
階層から「utils」を削除すると、facs をインポートしてfacs.so
メソッドを表示できます。
>>> import facs
>>> dir(facs)
['__doc__', '__file__', '__name__', '__package__', 'build', 'query', 'remove']
しかし、utils サブモジュールを元に戻し、さまざまな部分をインポートしようとすると、1 つの名前空間が他の名前空間をマスクしているように見えます (utils
によってエクスポートされたシンボルをマスクしますfacs.so
)。
>>> import facs
>>> dir(facs)
['__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__']
>>> import facs.utils
>>> facs.utils.galaxy.rsync_genomes("phix")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'galaxy'
>>> from facs.utils import galaxy
>>> galaxy.rsync_genomes("phix")
'Hello world'
ご覧のとおり、 after dir(facs)
、build
、query
andremove
はなくなり、最初の import ステートメントを再利用して直接直接アクセスする代わりにgalaxy
a を実行しない限り、適切にインポートされません。from facs.utils import galaxy
facs.utils.galaxy.rsync_genomes()
要約すると、このモジュールの使用目的は次のとおりです。
>>> import facs
>>> dir(facs)
['__doc__', '__file__', '__name__', '__package__', 'build', 'query', 'remove'
, 'utils'] <--- (Directly accessible from "facs")
>>> facs.utils.galaxy.rsync_genomes("phix")
'Hello world'
(現在開発中の)コードは次のとおりです。
https://github.com/brainstorm/facs/tree/develop
誰かが自分で試してみたい場合。私は virtualenvs を使用していますが、私の $PYTHONPATH は正しいようです:
/home/roman/.venvburrito/lib/python:
/home/roman/.virtualenvs/py27/lib/python2.7/site-packages
また、インストールも成功しているようです。
cd ~/.virtualenvs/py27/lib/python2.7/site-packages/facs-2.0dev-py2.7.egg/
(py27)$ ls
EGG-INFO facs.py facs.pyc facs.so utils/
__init__.py
最上位ディレクトリに実際にファイルがコピーされていないようですが、そこに触れても触れなくても、上記のインポート動作には影響しません。
何か案は?前もって感謝します!