2

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

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

a.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動作します。

4

1 に答える 1

2

サブパッケージが機能するにはcimport、パッケージ ディレクトリに__init__.pxd.

の代わりに__init__.pyforと同等です。cimportimport

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

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

次に、pxd ファイルをパッケージ データとしてインクルードしsetup.pyて、インストールできるようにします。

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 numpynumpy が既にインストールされていない限り、パッケージのインストールが機能しなくなるため、setup.py には含めないでください。

requirements.txtパッケージと一緒にインストールするために入れます。

于 2018-05-25T09:23:36.613 に答える