setuptoolsの問題 - データファイルを含むパッケージを除外

私はsetuptoolsにかなり新しいです。私はいくつかの同様の質問を見てきましたが、それは私が見た助言に従うように見えたが、setuptoolsはまだ私が望むものとは異なる何かをしていることが少し狂っている。

私のプロジェクトの構造は次のとおりです。

.
..
package1/
    __init__.py
    abc.py
    ...
tests/
    __init__.py
    test_package1.py
LICENSE
README.md
RELEASE
setup.py

そして私のsetup.pyの内容は次のとおりです:

#!/usr/bin/env python
import os
#from distutils.core import setup
from setuptools import setup, find_packages

setup(
    name='package1',
    version='1.1',
    test_suite="tests",
    packages=find_packages(exclude=['tests']),    
    include_package_data=True,
    package_data = {
        '': ['LICENSE', 'README.md5', 'RELEASE']
    },   
)

また、私のマニフェストファイルには次のものがあります:

include LICENSE
include RELEASE
include README.md

私はタールを作る:

python setup.py sdist

したい:

  1. ソース配布物から tests ディレクトリを除外します;
  2. site-packagesディレクトリのLICENSE、README.md、RELEASEファイルをトップレベルまたはpackage1ディレクトリ内に置いてください(この時点でどちらにも同意します)。

代わりに、ここで何が起こるのですか:

  1. tests directory remains to be in the created tar archive and gets installed to the site-packages;
  2. Files are copied to the archive, but do not get installed to the site-packaged directory of the package.

私はアイデアがありません、誰かが私に間違ってやっていることとそれを修正する方法を私に説明することができますか?

15
なぜpythonが私たちを愛していないのですか?非常に簡単で一般的な作業です:いくつかのファイルを無視し、パッケージ化するためにいくつかの珍しいファイルを含めます。なぜそれは難しいのですか?
追加された 著者 maxkoryukov,

4 答え

find_packages uses fnmatchcase for its exclude filtering. You can test if your exclusion pattern matches a package name as follows:

>>> from fnmatch import fnmatchcase
>>> fnmatchcase('my.package.name.tests', 'tests')
False

プロジェクトのすべてのテストが、 tests またはそのパッケージのサブパッケージで終わるパッケージ名で実行されていると仮定すると、すべてのテストコードを除外するためには、

setup(
    name='package1',
    version='1.1',
    packages=find_packages(exclude=['tests', '*.tests', '*.tests.*']),    
)
17
追加された
これは質問に対する最良の答えです
追加された 著者 Greg,

パッケージのルートレベルに MANIFEST.in という新しいファイルを作成し、次の手順に従ってください。

  1. To control which files end up in your tar file, create a new file called MANIFEST.in in the root level of your package. For example, you can exclude whole directories from your distribution, using recursive-exclude in the MANIFEST.in file. In your case, you need your MANIFEST.in file to contain:

    recursive-exclude tests *
    
  2. It's not common to include README and other files in the site-packages directory, but if you really want to, then go inside package1 and create symbolic links to the files you want to include:

    cd package1
    ln -s ../LICENSE
    ln -s ../README.md
    ln -s ../RELEASE
    

    Then change the following line in your setup.py:

    package_data = {
        '': ['LICENSE', 'README.md', 'RELEASE']
    

    to:

    package_data = {
        'package1': ['LICENSE', 'README.md', 'RELEASE']
    
16
追加された

MANIFEST.inはそれを世話します。

prune tests/
include LICENSE  README.md RELEASE

追加する静的ファイルがある場合は、

...
recursive-include package1/static *
0
追加された

あなたの構造が真の場合:

  1. testsフォルダはパッケージではありません( init .pyファイルがないため)、find_packageは除外しません。
  2. include_package_data = Trueは、明示的に除外されていなければすべてのバージョンファイルが含まれることを意味します。

そう:除外テストを試してください/ * MANIFEST.in

私はそれが助けたと思う

0
追加された
私はテストで init .pyを持っていますが、実際にはソースに表示されませんでした。実際、find_packages()の結果を出力すると、package1だけが返されます。しかし、testsフォルダはまだ含まれています。
追加された 著者 0x4B1D,