【问题标题】:What is "where" argument for in setuptools.find_packages?setuptools.find_packages 中的“where”参数是什么?
【发布时间】:2018-12-19 13:55:41
【问题描述】:

在一个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. 那么,wheresetuptools.find_packages 函数中的参数是什么?

【问题讨论】:

  • 看来where 函数正在定义包目录,即setuptools.find_packages 应该在哪里查看
  • 我认为这实际上可以通过在源后添加/来表示它是一个目录来解决?
  • @RBalasubramanian:在/ 后面添加'./source/' 无效

标签: python setuptools packaging


【解决方案1】:

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

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. 使用source 作为顶级包:不要使用package_dir,在项目根目录中查找包(packages=find_packages() 没有明确声明where)。

【讨论】:

  • 谢谢@hoefling!这个package_dir 选项解决了我的问题。还有关于不必要的__init__.py 文件的好消息!
  • 很高兴能帮上忙!
  • 有趣的是,解决他人问题的方法对帮助他人大有帮助!感谢@hoefling 的提示,它今天对我有所帮助。
  • @HelenNeely 很高兴听到这个消息!如果您需要更多关于包装源重新映射的信息,请查看 stdlib 文档中的 Listing whole packages 部分。
  • 我刚刚发现一篇关于python库打包的有用文章,它可能对其他用户有所帮助:blog.ionelmc.ro/2014/05/25/python-packaging
猜你喜欢
  • 2013-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-12
  • 2017-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多