Python扩展未安装到子包中

Python扩展未安装到子包中,python,distutils,python-extensions,Python,Distutils,Python Extensions,我试图构建一个Python扩展,并使用distutils对其进行打包,但不管我如何命名,扩展都会安装在根包中。我的目录布局如下所示: foo/bar/extension.c from distutils.core import setup from distutils.extension import Extension setup(name='foo.bar.extension', cmdclass={'build_ext': build_ext}, ext_mod

我试图构建一个Python扩展,并使用distutils对其进行打包,但不管我如何命名,扩展都会安装在根包中。我的目录布局如下所示:

foo/bar/extension.c
from distutils.core import setup
from distutils.extension import Extension

setup(name='foo.bar.extension',
      cmdclass={'build_ext': build_ext},
      ext_modules=[Extension('foo.bar.extension',
                             sources=['foo/bar/extension.c'])]
)
我的
setup.py
如下所示:

foo/bar/extension.c
from distutils.core import setup
from distutils.extension import Extension

setup(name='foo.bar.extension',
      cmdclass={'build_ext': build_ext},
      ext_modules=[Extension('foo.bar.extension',
                             sources=['foo/bar/extension.c'])]
)
我设置了一个
virtualenv
并运行

python setup.py install
然后在我的Python shell中:

>>> import foo.bar.extension
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named invest_cython_core
>>> import extension #This works!
导入foo.bar.extension 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 ImportError:没有名为invest\u cython\u core的模块 >>>导入扩展#这很有效!
我可以更改哪些内容,使第一个导入语句正常工作,第二个导入语句失败?

我认为您需要使用
foo/\uu init\uuuuuuuuuuuuuuuupy
foo/bar/\uuuuuuuu init\uuuuuuuuuuuuuuuuuuuupy
,以便distutils首先安装这些包,然后安装扩展模块。(在这里,一个错误比一个无声的错误行为要好,我将打开一个bug报告,以便distutils2表现得更好。)


您使用的是自定义的build\u ext类吗?(在您的示例中,由于
cmdclass={'build\u ext':build\u ext}
而询问)这可能是问题的一部分。

我认为您需要
foo/\uu init\uuuuuuuuuuuuuuuuupy
foo/bar/\uuuuuu init\uuuuuuuuuuuuuuuuuupy.py
,以便distutils首先安装这些包,然后安装扩展模块。(在这里,一个错误比一个无声的错误行为要好,我将打开一个bug报告,以便distutils2表现得更好。)


您使用的是自定义的build\u ext类吗?(询问原因可能与此问题有关。

感谢您的回复。是的,我没有意识到这很重要,但我正在使用Cython的build\u ext模块。我对这方面不太了解,但Cython似乎在嵌套扩展中表现不好。此后,我将扩展移到了包的根目录下,虽然我更希望它处于嵌套状态,但它工作得很好。这是我用来学习编译扩展的唯一参考吗?通常Cython的build_ext类应该只是扩展distutils类的功能,所以distutils文档应该足够了,但你永远不知道。您是否测试过我关于创建init.py文件而不是将ext移动到顶层的建议?是的,我最初设置了项目,因此cython文件位于同样具有init.py的目录中。这就是你的意思吗?我在Cython常见问题解答中也看到,您不能使用子包编译Cython。我不确定这是否是对我的问题的描述:是的,看起来这是你的问题。谢谢你的回复。是的,我没有意识到这很重要,但我正在使用Cython的build\u ext模块。我对这方面不太了解,但Cython似乎在嵌套扩展中表现不好。此后,我将扩展移到了包的根目录下,虽然我更希望它处于嵌套状态,但它工作得很好。这是我用来学习编译扩展的唯一参考吗?通常Cython的build_ext类应该只是扩展distutils类的功能,所以distutils文档应该足够了,但你永远不知道。您是否测试过我关于创建init.py文件而不是将ext移动到顶层的建议?是的,我最初设置了项目,因此cython文件位于同样具有init.py的目录中。这就是你的意思吗?我在Cython常见问题解答中也看到,您不能使用子包编译Cython。我不确定这是否是对我的问题的描述:是的,看起来这是你的问题。