我在使用python3的virtualenv中使用nose和cython时遇到了一个非常奇怪的错误。出于某种原因,即使python -m unittest basic_test.py
正在运行,nosetests也开始给我一个ImportError。我创建了一个新目录来重现错误,以确保该目录中没有任何奇怪的内容。
以下是三个文件:fileA.pyx,setup.py和basic_test.py
file1.pyx
class FileA:
def __init__(self):
self.temp = {}
setup.py:
from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
ext_modules = [
Extension('fileA', ['fileA.pyx'],)
]
setup(
name='test',
ext_modules=ext_modules,
cmdclass={'build_ext': build_ext},
)
basic_test.py:
def test():
from fileA import FileA
FileA()
assert True
新目录。我跑python setup.py build_ext --inplace
。它汇编。我运行nosetests
单次测试通过。
然后我执行touch __init__.py
,然后再次运行nosetests
,但失败并出现此错误:
ImportError: No module named 'fileA'
这是一个错误还是我不明白 init 如何影响导入?
更新: 我找到了关于导入陷阱的post,并阅读了可能解释添加 init 如何打破它的内容。我仍然不知道它是如何适应的。
由于修复,这是Python 3.3中添加的全新陷阱 上一个陷阱:如果在sys.path上遇到一个子目录作为一部分 包导入包含 init .py文件,然后包含Python 解释器将创建一个仅包含的单个目录包 来自该目录的模块,而不是适当地找到所有模块 命名子目录,如上一节所述。