次のディレクトリ構造があります。
testcython/
setup.py
testcython/
__init__.py
foo.pyx
stuff.py
bar/
__init__.pxd
__init__.py
bar.pxd
bar.pyx
ファイルの内容は次のとおりです。
bar.pxd
# cython: language_level=3
cdef int square(int x)
bar.pyx
# cython: language_level=3
cdef int square(int x):
return x * x
foo.pyx
# cython: language_level=3
import cython
cimport numpy as np
import numpy as np
from .Bar cimport square
def do_square(x):
return square(x)
stuff.py
from __future__ import print_function
from .Foo import do_square
def do():
print(do_square(2))
setup.py
import os, sys
from Cython.Build import build_ext, cythonize
from setuptools import setup, Extension, find_packages
def ext_modules():
import numpy as np
include_dirs = ['.', np.get_include()]
root_dir = os.path.abspath(os.path.dirname(__file__))
bar_ext = Extension(
"Bar",
sources=[root_dir + "/testcython/bar/bar.pyx"],
include_dirs=include_dirs,
)
foo_ext = Extension(
"Foo",
sources=[root_dir + "/testcython/foo.pyx"],
include_dirs=include_dirs
)
exts = [bar_ext, foo_ext]
return cythonize(exts)
REQUIREMENTS = [
"numpy",
"cython"
]
setup(
name="testcython",
packages=find_packages(),
ext_package="testcython",
ext_modules=ext_modules(),
cmdclass={"build_ext" : build_ext},
zip_safe=False,
install_requires=REQUIREMENTS
)
質問
pip install -e .
問題は、これを (トップディレクトリに)インストールしようとするとtestcython
、Cython から次のエラーが表示されることです。
Complete output from command python setup.py egg_info:
Error compiling Cython file:
------------------------------------------------------------
...
import cython
cimport numpy as np
import numpy as np
from .Bar cimport square
^
------------------------------------------------------------
testcython/foo.pyx:7:0: relative cimport beyond main package is not allowed
Error compiling Cython file:
------------------------------------------------------------
...
import numpy as np
from .Bar cimport square
def do_square(x):
return square(x)
^
------------------------------------------------------------
この回答 ( cython: relative cimport beyond main package is not allowed ) は、オブジェクトの引数にルート dir ( '.'
)を含めることで問題が解決されることを意味します。include_dirs
Extension
Cythonドキュメントのこの部分では、パッケージを使用するときzip_safe=False
の引数で使用することに言及しています。setup
setuptools
上記のファイルからわかるsetup.py
ように、これらの両方を含めましたが、それでも上記のエラーが表示されます。
注:Extension
(コンストラクター内の) 拡張機能の名前をそれぞれ から および に変更するBar
と、別のエラーが発生します。Foo
testcython.Bar
testcython.Foo
Complete output from command python setup.py egg_info:
Error compiling Cython file:
------------------------------------------------------------
...
import cython
cimport numpy as np
import numpy as np
from .Bar cimport square
^
------------------------------------------------------------
testcython/foo.pyx:7:0: 'testcython/Bar/square.pxd' not found
Error compiling Cython file:
------------------------------------------------------------
...
import numpy as np
from .Bar cimport square
def do_square(x):
return square(x)
^
------------------------------------------------------------