setuptools.find_packages 中的 "where" 参数是什么?

What is "where" argument for in setuptools.find_packages?

在 python 项目中,我试图将源代码和单元测试分开;这是项目结构:

MyProject/
    MANIFEST.in
    README.md
    setup.py
    source/
        __init.py__
        my_project/
            __init.py__
            some_module.py
    test/
        __init.py__
        my_project/
            __init.py__
            test_some_module.py

这里是 setup.py 文件:

from setuptools import setup, find_packages

setup(
    name='my_project',
    packages=find_packages(where='./source'),
    description='My project to be packaged',
    version='1.0.0',
    author='me'
    install_requires=[
        'fastnumbers~=2.0.1',
        'numpy~=1.14.1',
        'pandas~=0.22.0'
    ],
    extras_require={
        'dev': ['check-manifest'],
        'test': [
            'mock',
            'PyHamcrest',
            'pytest',
            'pytest-cov'
        ],
    }
)

然后,当我 运行 命令 python3 setup.py sdist 时,它失败并输出以下内容:

running sdist
running egg_info
writing my_project.egg-info/PKG-INFO
writing requirements to my_project.egg-info/requires.txt
writing dependency_links to my_project.egg-info/dependency_links.txt
writing top-level names to my_project.egg-info/top_level.txt
error: package directory 'my_project' does not exist

生成的 top_level.txt 文件看起来不错:

 my_project

但是 setuptools 似乎没有从 source 文件夹开始寻找要打包的模块。

  1. 我是否必须将 setup.pyMANIFEST.in 文件移动到 source 文件夹中?
  2. 但是,setuptools.find_packages 函数中的这个 where 参数是什么?

您距离可行的解决方案仅一步之遥。添加

package_dir={
    '': 'source',
},

setup() 个参数:

setup(
    ...,
    packages=find_packages(where='source'),
    package_dir={
        '': 'source',
    },
    ...
)

有关包重新映射的更多信息,请参阅 Listing whole packages 部分。

但是,您似乎通过在其中放置 __init__.pysource 目录设为 python 包。那是故意的吗?你有像

这样的导入语句吗
import source.my_project
from source.my_project.my_module import stuff

或类似的,使用 source 作为包名?然后请注意,一旦您安装了构建的软件包,导入就会失败,因为在构建时包含源代码时会省略 source 。我看到两种方式:

  1. 要么删除 source/__init__.py,像上面描述的那样使用 package_dir 使 my_project 成为顶层包,在导入中省略 source(如果出现任何错误,只需删除 myproject-1.0.0.egg_info 目录并使用 python setup.py egg_info) 或
  2. 重新创建它
  3. 使用 source 作为顶级包:不要使用 package_dir,在项目根目录中查找包(packages=find_packages() 没有明确说明 where)。