web-dev-qa-db-ja.com

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'
        ],
    }
)

次に、コマンド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.pyおよびMANIFEST.inファイルをsourceフォルダーに移動する必要がありますか?
  2. しかし、それでは、setuptools.find_packages関数のこのwhere引数は何ですか?
12
Géraud

あなたは実用的なソリューションから一歩離れています。追加

_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が省略されるため、ビルドしたパッケージをインストールするとインポートが失敗することに注意してください。私には2つの方法があります。

  1. _source/__init__.py_を削除するか、上記のように_package_dir_を使用して、最上位パッケージに_my_project_を作成するか、インポートでsourceを省略します(エラーが発生した場合は、_myproject-1.0.0.Egg_info_ dirおよび_python setup.py Egg_info_)で再作成、または
  2. トップレベルのパッケージとしてsourceを使用:_package_dir_を使用せず、プロジェクトのルートディレクトリでパッケージを探します(whereを明示的に指定せずにpackages=find_packages())。
10
hoefling