python - setuptools.find_packages 中的“where”参数是什么?
问题描述
在一个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'
],
}
)
然后,当我运行 command 时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
文件夹开始查找要打包的模块。
- 我必须将文件移动到
setup.py
文件夹中吗?MANIFEST.in
source
- 但是,这个
where
参数在setuptools.find_packages
函数中是什么?
解决方案
您距离可行的解决方案仅一步之遥。添加
package_dir={
'': 'source',
},
setup()
论据:
setup(
...,
packages=find_packages(where='source'),
package_dir={
'': 'source',
},
...
)
有关包重新映射的更多信息可以在列出整个包部分中找到。
但是,看起来您通过在其中source
放置了一个 python 包的目录__init__.py
。那是故意的吗?您是否有类似的导入语句
import source.my_project
from source.my_project.my_module import stuff
或类似的,source
用作包名?然后请注意,一旦您安装了构建的包,导入将失败,因为source
在构建时包含源代码时会被省略。我看到两种方法:
- 要么 remove
source/__init__.py
,package_dir
像上面描述的那样使用来制作my_project
顶级包,source
在导入中省略(如果你遇到任何错误,只需删除myproject-1.0.0.egg_info
dir 并使用 重新创建它python setup.py egg_info
),或者 - 用作
source
顶级包:不要使用package_dir
,在项目根目录中查找包(packages=find_packages()
没有明确说明where
)。
推荐阅读
- entity-framework-core - 查询
等效于 EF Core 3.1 - javascript - 如何使用过渡属性?
- php - 如何使用 mysqli 查询连接来自两个不同数据库的两个表?
- odbc - 表格模型和分析服务和 ODBC
- python - 使用 pandas 或其他方式将元组列表转换为相关矩阵
- java - 为什么我的测试 Java 方法只返回列表中的第一个键?
- python - 如何使用 Sphinx 在 Python 文档字符串中指示有效范围?
- nunjucks - 如何防止 11/nunjucks 在 for 循环中转义内容
- android - 如何将 OpenGL 与计时器一起使用
- javascript - 从用户选中的选项生成随机图像