2

この質問は、次のものと似ています。

ネストされた Python C 拡張機能/モジュール?

少しひねるだけです。ここでは、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)buildqueryandremoveはなくなり、最初の import ステートメントを再利用して直接直接アクセスする代わりにgalaxy a を実行しない限り、適切にインポートされません。from facs.utils import galaxyfacs.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最上位ディレクトリに実際にファイルがコピーされていないようですが、そこに触れても触れなくても、上記のインポート動作には影響しません。

何か案は?前もって感謝します!

4

1 に答える 1

0

facsパッケージではなく、最初にsoファイルをインポートすることに注意してください。FacsパッケージのソースディレクトリでPythonコンソールを実行していますか?

パッケージディレクトリの外に出てみてください。そうすれば、すべてが理にかなっています。

また、次のインポートでは、facsディレクトリの背後にあるすべてのモジュールがインポートされるとは限りません。

>> import facs
>> dir (facs)
['__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__']

各ファイルにインポートを設定する必要があり__init__.pyます。たとえば、ファイルからいくつかのシンボルをエクスポートする.so場合は、ファイルにimport facs次の内容が含まれている必要があり__init__.pyます。

>> from _facs import function_name, function_name .....

そして、あなたがそうするときimport facs、それはあなたのためにそれらの関数をインポートします。

サブパッケージutilsにも同じパターンを使用します。

パッケージ名とモジュール名の名前の衝突を避けるために、ファイルの名前をfacs.sofileに変更することもお勧めします。_facs.so

于 2013-03-01T17:32:48.213 に答える