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

时间:2018-07-11 13:36:59

标签: python setuptools packaging

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

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/football_pitch">

    <TextView
        android:id="@+id/playerNameTop"
        android:layout_width="350dp"
        android:layout_height="358dp"
        android:layout_marginStart="16dp"
        android:drawableTop="@drawable/ic_football_top"
        android:text="TextView"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.0" />

</RelativeLayout>

这是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文件夹开始,无法找到要打包的模块。

  1. 我是否需要将sourcesetup.py文件移动到MANIFEST.in文件夹中?
  2. 但是,source函数中的这个where自变量是什么?

1 个答案:

答案 0 :(得分:7)

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

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

转到setup()参数:

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

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

但是,好像您通过在其中放置source来将__init__.py目录创建为python软件包。那是故意的吗?您是否有类似

的导入语句?
import source.my_project
from source.my_project.my_module import stuff

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

  1. 删除source/__init__.py,使用如上所述的package_dirmy_project制作为顶级软件包,在导入中省略source(如果出现任何错误,只需删除myproject-1.0.0.egg_info目录,并使用python setup.py egg_info重新创建),或
  2. 使用source作为顶层程序包:不要使用package_dir,请在项目根目录(packages=find_packages()中未明确说明where的情况下查找程序包。) li>