【发布时间】:2017-10-20 11:22:23
【问题描述】:
我在一个包内有一个 cython 扩展,其结构如下:
packagename
├── MANIFEST.in
├── packagename
│ ├── __init__.py
│ ├── packagename.py
│ ├── subpackage1
│ │ ├── __init__.py
│ │ ├── subpackage1.py
│ │ └── cythonExt1.pyx
│ ├── subpackage2
│ │ ├── __init__.py
│ │ ├── subpackage2.py
│ │ └── cythonExt2.pyx
│ └── VERSION
├── requirements.txt
└── setup.py
当我尝试在导入 numpy 的 cythonExt2.pyx 中添加一行时,我收到以下错误:
-------------------------------------------------------------
SystemError Traceback (most recent call last)
<ipython-input-5-5c4ef4d8efd3> in <module>()
1 # Calling Functions of Interest
----> 2 import pacakge.subpackage2 as thingy
3 import numpy as np
4 import matplotlib.pyplot as plt
/home/user/anaconda2/envs/python3/lib/python3.5/site-packages/pacakage-0.0.3-py3.5-linux-x86_64.egg/package/__init__.py in <module>()
18
19 # the following line imports all the functions from package.py
---> 20 from .package import *
21 import package.subpackage1
22 import package.subpackage2
/home/user/anaconda2/envs/python3/lib/python3.5/site-packages/package-0.0.3-py3.5-linux-x86_64.egg/package/package.py in <module>()
1 from package.subpackage1 import thingy1
----> 2 from package.subpackage2 import thingy2
3 import numpy as _np
4 from multiprocessing import Pool as _Pool
/home/user/anaconda2/envs/python3/lib/python3.5/site-packages/package-0.0.3-py3.5-linux-x86_64.egg/package/subpackage2/subpackage2.py in <module>()
3 import os
----> 4 from cythonExt2 import solve as solve_cython
5 from frange import frange
6
/home/user/anaconda2/envs/python3/lib/python3.5/site-packages/package-0.0.3-py3.5-linux-x86_64.egg/package/subpackage2/cythonExt2.pyx in init package.subpackge2.cythonExt2 (package/subpackage2/cythonExt2.c:6158)()
1 cimport numpy
----> 2 import numpy
3 cimport cython
4
5 def get_z_n(n, z):
SystemError: Parent module '' not loaded, cannot perform relative import
如果我只是 cimport numpy 这可以工作并且我可以访问 numpy C API 但我无法导入我需要解决特定问题的 numpy python 函数。
为什么会这样,我该如何解决?
我想知道我的设置文件是否存在导致此功能无法正常工作的问题。我的 setup.py 文件的 cython 部分如下所示:
from setuptools import setup
from setuptools.extension import Extension
from Cython.Build import cythonize
from Cython.Build import build_ext
extensions = [Extension(
name="cythonExt1",
sources=["package/subpackage1/cythonExt1.pyx"],
include_dirs=[numpy.get_include()],
),
Extension(
name="cythonExt2",
sources=["package/subpackage2/cythonExt2.pyx"],
include_dirs=[numpy.get_include()],
)
]
setup(name='package',
...
include_package_data=True,
packages=['package',
'package.subpackage1',
'package.subpackage2',
],
ext_modules = cythonize(extensions),
install_requires=requirements,
)
【问题讨论】:
-
看起来您的“20”行有问题。一个点可能只出现在两个真实姓名之间,而不是在开头。只需删除点并将父目录添加到 PYTHONPATH。
-
这很奇怪,因为没有 cythonExt2.pyx 文件中的 import numpy 行,代码工作正常,我也在我编写的其他几个包中执行此操作,并且在这些包中工作正常。我会尝试更改它,看看它是否能解决我的问题。
-
我这样做是为了导入 package.py 目录的内容,这样当我在 python 中导入包时,我可以执行 package.function。当我将目录添加到路径并导入包时,我只会得到一个没有导入函数的递归 package.package.package.package。
-
Numpy 也使用这种技术来导入它的核心实用程序github.com/numpy/numpy/blob/master/numpy/__init__.py#L159
-
如果我在模块外部使用
import numpy as np行对代码进行 cythonize 处理,它可以正常工作。如果我可以让 import 语句在我的模块安装中工作,它应该可以按预期工作。