命令' python setup.py build_ext——inplace '总是创建一个新目录



假设我有一个结构如下的python包:

foo/
  __init__.py
  setup.py
  bar/
    __init__.py
    bar.pyx

setup.py的含量为

from distutils.core import setup
from Cython.Build import cythonize
import numpy as np
setup(
    ext_modules=cythonize("bar/bar.pyx"),
    include_dirs=[np.get_include()]
)

然后我就运行

python setup.py build_ext --inplace

因为我需要编译的文件bar.so正好放在bar/中。但是前面的命令在bar下创建了一个新目录foo/bar/,并将bar.so放在那里,例如

foo/
  __init__.py
  setup.py
  bar/
    __init__.py
    bar.pyx
    foo/
      bar/
        bar.so

而我需要的是

foo/
  __init__.py
  setup.py
  bar/
    __init__.py
    bar.pyx
    bar.so

这些恼人的事情发生在我把foobar变成一个包之后。如果我删除foo/__init__.pybar/__init__.py,那么bar.so将出现在foo/中,仍然不是foo/bar/。我已经阅读了使用手册,但是没有找到解决这个问题的方法。

那么,如果我需要bar.so出现在正确的位置,同时保留两个__init__.py文件,我该怎么办?

setup.py不应该存在于包中。您需要将包向上移动一个目录:

foo/
  setup.py
  foo/
    __init__.py
    bar/
      __init__.py
      bar.pyx

这是我遇到的大多数包都遵循的结构。


对于你曾经使用过的scikit-learn:

我当然不知道scikit-learn对它们的多个setup.py文件做了什么,但我敢打赌,我猜外部的setup.py正在使用(调用、导入)其他setup.py,将子包的配置细节分发给那些单独的setup.py。它只是不太明显,因为(我认为)distutils/setuptools在底层做了很多这样的导入。

因此,外部设置负责整个包,内部设置负责子包的细节。

但最后,它仍然是另一层的一个大setup.py文件。尝试运行

python setup.py build_ext --inplace

在任何一个内部setup.py上,它要么失败,要么什么都不做(至少对于我给它的两次尝试)。

因此,这些子包setup.py s可能更适合被视为setup_config.py文件。

作为一个有趣的结果,安装包将把这些setup.py文件保存在它们各自的子包中(以及sklearn中的文件)。也许在使用包的时候会有一些用处,但我猜这只是scikit-learn设置过程和包含所有*.py文件的人工产物。

相关内容

  • 没有找到相关文章

最新更新