bugfix> python > 投稿

私は見たこの質問 答えはうまくいかないようです。以下は私のディレクトリ構造です。

.
├── my_package
│   ├── a.pyx
│   ├── b.pyx
│   ├── b.pxd
│   ├── test.py
│   └── __init__.py
└── setup.py

.pyxファイル

cimport my_package.b  as b
class a:
    def __init__(self):
        self.b = b.b()
        self.b.run()

b.pyxファイル

cdef class b:
    def __init__(self):
        pass
    cpdef run(self):
        print "b is running"

b.pxdファイル

cdef class b:
    cpdef run(self)

test.py

import a
c = a.a()

setup.py

from distutils.core import setup
from distutils.extension import Extension
from Cython.Build import cythonize
import numpy
extensions = [
    Extension("my_package.a", ["my_package/a.pyx"]
        ),
    Extension("my_package.b", ["my_package/b.pyx"]
)
]
for e in extensions:
    e.cython_directives = {"embedsignature": True}
setup(
    name = "preprocess",
    ext_modules = cythonize(extensions),
)

python setup.py build_ext --inplace を実行した後コンパイルエラーはありません。しかし、test.pyを実行しようとすると、 ImportError: No module named my_package.b が表示されます 。

任意の入力をいただければ幸いです。

ところで、a.pyxの最初の行を cimport my_package.b as b から変更した場合 import b へそれが動作します。

回答 1 件
  • cimport の場合  動作するサブパッケージの場合、パッケージディレクトリには __init__.pxd が含まれている必要があります 。

    __init__.py と同等です   cimport の   import の代わりに 。

    ディレクトリ構造を次のようにします。

    .
    ├── my_package
    │   ├── a.pyx
    │   ├── b.pyx
    │   ├── b.pxd
    │   ├── test.py
    │   └── __init__.py
    │   └── __init__.pxd
    └── setup.py
    
    

    次に、 setup.py にパッケージデータとしてpxdファイルを含めます  インストールされるように:

    from setuptools import setup, Extension
    from Cython.Build import cythonize
    extensions = [
        Extension("my_package.a", ["my_package/a.pyx"]
            ),
        Extension("my_package.b", ["my_package/b.pyx"]
    )
    ]
    for e in extensions:
        e.cython_directives = {"embedsignature": True}
    package_data = {'my_package': ['*.pxd']}
    setup(
        name = "preprocess",
        ext_modules = cythonize(extensions),
        include_package_data=True,
        package_data=package_data,
    )
    
    

    注- import numpy  numpyが既にインストールされていない場合、パッケージのインストールが機能しなくなるため、setup.pyに含めないでください。

    requirements.txt に入れる  パッケージとともにインストールします。

あなたの答え