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

Gér*_*aud 9 python packaging setuptools

在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
Run Code Online (Sandbox Code Playgroud)

这是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'
        ],
    }
)
Run Code Online (Sandbox Code Playgroud)

然后,当我运行命令时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
Run Code Online (Sandbox Code Playgroud)

生成的top_level.txt文件看起来很好:

 my_project
Run Code Online (Sandbox Code Playgroud)

但它看起来setuptools不是从source文件夹开始找到要打包的模块.

  1. 我有移动setup.pyMANIFEST.in文件到source文件夹?
  2. 但那么,这个where论点在setuptools.find_packages功能上是什么?

hoe*_*ing 12

您离工作解决方案只有一步之遥.加

package_dir={
    '': 'source',
},
Run Code Online (Sandbox Code Playgroud)

setup()参数:

setup(
    ...,
    packages=find_packages(where='source'),
    package_dir={
        '': 'source',
    },
    ...
)
Run Code Online (Sandbox Code Playgroud)

但是,看起来你source通过__init__.py在其中放置了一个python包的dir .这是故意的吗?你有像这样的导入语句吗?

import source.my_project
from source.my_project.my_module import stuff
Run Code Online (Sandbox Code Playgroud)

或类似的,使用source包名?然后要注意,一旦安装构建的包,导入将失败,因为source在构建时包含源时会省略.我看到两种方式:

  1. 删除source/__init__.py,使用package_dir如上所述进行my_project顶级包,省略source导入(如果你得到任何错误,只需删除myproject-1.0.0.egg_infodir并重新创建python setup.py egg_info),或者
  2. 使用source作为顶级包:不使用package_dir,请在该项目的根目录软件包(packages=find_packages()但没有明确说明where).

  • 谢谢@hoefling!这个`package_dir` 选项解决了我的问题。还有关于不必要的`__init__.py`文件的好消息! (2认同)
  • 有趣的是,解决别人的问题对帮助他人大有帮助!感谢@hoefling 的提示,它今天帮助了我。 (2认同)