web-dev-qa-db-ja.com

「python setup.py sdist」がプロジェクトのルートディレクトリに不要な「PROJECT-Egg.info」を作成するのはなぜですか?

私が走るとき

  python setup.py sdist

./distディレクトリにsdistを作成します。これには、「dist」フォルダ内のZipにある「PROJECT-Egg.info」ファイルが含まれていますが、これは使用しませんが、害はないので無視します。

私の質問は、なぜそれがプロジェクトのルートディレクトリに「PROJECT-Egg.info」フォ​​ルダを作成するのかまたはですか。これを作成しないようにできますか?そうでない場合は、sdistを作成した直後に削除できますか?

Setuptoolsからインポートした「セットアップ」機能を使用しています。 WindowsXP、Python2.7、Setuptools 0.6c11、Distribute 0.6.14。

私のセットアップ構成は次のようになります:

{'author': 'Jonathan Hartley',
 'author_email': '[email protected]',
 'classifiers': ['Development Status :: 1 - Planning',
                 'Intended Audience :: Developers',
                 'License :: OSI Approved :: BSD License',
                 'Operating System :: Microsoft :: Windows',
                 'Programming Language :: Python :: 2.7'],
 'console': [{'script': 'demo.py'}],
 'data_files': [('Microsoft.VC90.CRT',
                 ['..\\lib\\Microsoft.VC90.CRT\\Microsoft.VC90.CRT.manifest',
                  '..\\lib\\Microsoft.VC90.CRT\\msvcr90.dll'])],
 'description': 'Utilities for games and OpenGL graphics, built around Pyglet.\n',
 'keywords': '',
 'license': 'BSD',
 'long_description': "blah blah blah",
 'name': 'pygpen',
 'options': {'py2exe': {'ascii': True,
                        'bundle_files': 1,
                        'dist_dir': 'dist/pygpen-0.1-windows',
                        'dll_excludes': [],
                        'excludes': ['_imaging_gif',
                                     '_scproxy',
                                     'clr',
                                     'dummy.Process',
                                     'email',
                                     'email.base64mime',
                                     'email.utils',
                                     'email.Utils',
                                     'ICCProfile',
                                     'Image',
                                     'IronPythonConsole',
                                     'modes.editingmodes',
                                     'startup',
                                     'System',
                                     'System.Windows.Forms.Clipboard',
                                     '_hashlib',
                                     '_imaging',
                                     '_multiprocessing',
                                     '_ssl',
                                     '_socket',
                                     'bz2',
                                     'pyexpat',
                                     'pyreadline',
                                     'select',
                                     'win32api',
                                     'win32pipe',
                                     'calendar',
                                     'cookielib',
                                     'difflib',
                                     'doctest',
                                     'locale',
                                     'optparse',
                                     'pdb',
                                     'pickle',
                                     'pyglet.window.xlib',
                                     'pyglet.window.carbon',
                                     'pyglet.window.carbon.constants',
                                     'pyglet.window.carbon.types',
                                     'subprocess',
                                     'tarfile',
                                     'threading',
                                     'unittest',
                                     'urllib',
                                     'urllib2',
                                     'win32con',
                                     'zipfile'],
                        'optimize': 2}},
 'packages': ['pygpen'],
 'scripts': ['demo.py'],
 'url': 'http://code.google.com/p/edpath/',
 'version': '0.1',
 'zipfile': None}
49

このディレクトリは、ソース配布のビルドプロセスの一部として意図的に作成されます。 setuptoolsの開発者ガイド を少し見ると、その理由がわかります。

ただし、MANIFESTを扱うdistutilsのドキュメントの一部、またはMANIFEST.inからの生成方法は無視してください。 setuptoolsはこれらの問題からユーザーを保護し、どのような場合でも同じようには機能しません。 distutilsとは異なり、setuptoolsはソース配布をビルドするたびにソース配布マニフェストファイルを再生成し、それをメインプロジェクトディレクトリの邪魔にならないように、プロジェクトの.Egg-infoディレクトリ内にビルドします。したがって、最新であるかどうかを心配する必要はありません。

ビルドが完了したら、ディレクトリを安全に削除できます。

ボーナス編集:

私の多くのPythonプロジェクトを削除するsetup.py内のcleanコマンドをカスタマイズして、*.Egg-infodistbuild、および*.pycおよびその他のファイルを削除します。これがsetup.pyでどのように実行されるかの例です。

import os
from setuptools import setup, Command

class CleanCommand(Command):
    """Custom clean command to tidy up the project root."""
    user_options = []
    def initialize_options(self):
        pass
    def finalize_options(self):
        pass
    def run(self):
        os.system('rm -vrf ./build ./dist ./*.pyc ./*.tgz ./*.Egg-info')

# Further down when you call setup()
setup(
    # ... Other setup options
    cmdclass={
        'clean': CleanCommand,
    }
)

たとえば、 "poop"というダミーのプロジェクトでpython setup.py buildを実行すると(はい、私は非常に成熟しています)、次のようになります。

$ python setup.py build
running build
running build_py
creating build
creating build/lib
creating build/lib/poop
copying poop/__init__.py -> build/lib/poop

そして、python setup.py cleanを実行すると:

$ python setup.py clean
running clean
removed `./build/lib/poop/__init__.py'
removed directory: `./build/lib/poop'
removed directory: `./build/lib'
removed directory: `./build'

多田!

53
jathanism

-Egg.infoフォルダは、必ずしも削除できる一時的なアーティファクトであるとは限りません。

たとえば、「編集可能な」インストールにpip install -e YOURPACKAGEを使用する場合(python setup.py developのようなシンボリックリンクを介して機能するため、ローカルで編集するたびにパッケージを再インストールする必要はありません)、-Egg.infoフォルダーは、パッケージが別のソースにインポートされる実行時に必要です。存在しない場合は、DistributionNotFoundエラーが発生します。

16
Chris Johnson

PROJECT.Egg-infoアーティファクトをsdistから完全に消去できることに注意してください。

コマンドsetup.py Egg_infoは、デフォルトでソースルートをEggベースとして使用するため、PROJECT.Egg-infoディレクトリがsdistにパッケージ化されます。

オプション--Egg-baseを渡すことで、Eggベースを構成できます。これにより、PROJECT.Egg-infoディレクトリが別の場所に作成され、ソースディストリビューションから完全に除外されます。 setup.cfgを使用してそのプロパティを設定することもできます。

PROJECT.Egg-infoなしでsdistを作成する次のコマンドは、私にとっては機能します。

python setup.py Egg_info --Egg-base /tmp sdist

またはsetup.cfg

[Egg_info]
Egg_base = /tmp
10
user245678

Pythonのパッケージ化とビルドシステムが壊れています。そのため、箱から出してすぐに動作するであろうものには、多くのハックと回避策があります。

ただし、*。Egg-infoを削除するために見つけた「最もクリーンな」ハックは、通常のclean --allスイッチとEgg_infoを使用して* .Egg-infoファイルをサブフォルダーに配置し、 cleanコマンドによってクリーニングされます。ここに例を示します:

setup.cfgでは、次のようなものを使用します。

[Egg_info]
Egg_base = ./build/lib

ここで、./build/libclean --allが削除するフォルダーです。次に、setuptoolsを使用してプロジェクトをビルドするときに、-allフラグを指定してcleanコマンドを使用します。

python setup.py bdist_wheel clean --all

ソースバンドルもビルドする場合は、sdistの前にbdist_wheelをビルドして、build/libフォルダーが存在することを確認してください。例:

python setup.py bdist_wheel sdist clean --all

1
masi