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
文件夹开始寻找要打包的模块。
- 我是否必须将
setup.py
和 MANIFEST.in
文件移动到 source
文件夹中?
- 但是,
setuptools.find_packages
函数中的这个 where
参数是什么?
您距离可行的解决方案仅一步之遥。添加
package_dir={
'': 'source',
},
到 setup()
个参数:
setup(
...,
packages=find_packages(where='source'),
package_dir={
'': 'source',
},
...
)
有关包重新映射的更多信息,请参阅 Listing whole packages 部分。
但是,您似乎通过在其中放置 __init__.py
将 source
目录设为 python 包。那是故意的吗?你有像
这样的导入语句吗
import source.my_project
from source.my_project.my_module import stuff
或类似的,使用 source
作为包名?然后请注意,一旦您安装了构建的软件包,导入就会失败,因为在构建时包含源代码时会省略 source
。我看到两种方式:
- 要么删除
source/__init__.py
,像上面描述的那样使用 package_dir
使 my_project
成为顶层包,在导入中省略 source
(如果出现任何错误,只需删除 myproject-1.0.0.egg_info
目录并使用 python setup.py egg_info
) 或 重新创建它
- 使用
source
作为顶级包:不要使用 package_dir
,在项目根目录中查找包(packages=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'
],
}
)
然后,当我 运行 命令 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
文件夹中? - 但是,
setuptools.find_packages
函数中的这个where
参数是什么?
您距离可行的解决方案仅一步之遥。添加
package_dir={
'': 'source',
},
到 setup()
个参数:
setup(
...,
packages=find_packages(where='source'),
package_dir={
'': 'source',
},
...
)
有关包重新映射的更多信息,请参阅 Listing whole packages 部分。
但是,您似乎通过在其中放置 __init__.py
将 source
目录设为 python 包。那是故意的吗?你有像
import source.my_project
from source.my_project.my_module import stuff
或类似的,使用 source
作为包名?然后请注意,一旦您安装了构建的软件包,导入就会失败,因为在构建时包含源代码时会省略 source
。我看到两种方式:
- 要么删除
source/__init__.py
,像上面描述的那样使用package_dir
使my_project
成为顶层包,在导入中省略source
(如果出现任何错误,只需删除myproject-1.0.0.egg_info
目录并使用python setup.py egg_info
) 或 重新创建它
- 使用
source
作为顶级包:不要使用package_dir
,在项目根目录中查找包(packages=find_packages()
没有明确说明where
)。