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',
},
...
)
_
パッケージの再マッピングに関する詳細情報は パッケージ全体のリスト セクションにあります。
ただし、source
ディレクトリをpythonパッケージに___init__.py
_を配置することによって作成したようです。それは意図的なものでしたか?次のようなインポート文がありますか?
_import source.my_project
from source.my_project.my_module import stuff
_
または同様に、source
をパッケージ名として使用しますか?次に、ビルドにソースを含めるときにsource
が省略されるため、ビルドしたパッケージをインストールするとインポートが失敗することに注意してください。私には2つの方法があります。
source/__init__.py
_を削除するか、上記のように_package_dir
_を使用して、最上位パッケージに_my_project
_を作成するか、インポートでsource
を省略します(エラーが発生した場合は、_myproject-1.0.0.Egg_info
_ dirおよび_python setup.py Egg_info
_)で再作成、またはsource
を使用:_package_dir
_を使用せず、プロジェクトのルートディレクトリでパッケージを探します(where
を明示的に指定せずにpackages=find_packages()
)。