私が走るとき
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}
このディレクトリは、ソース配布のビルドプロセスの一部として意図的に作成されます。 setuptoolsの開発者ガイド を少し見ると、その理由がわかります。
ただし、MANIFESTを扱うdistutilsのドキュメントの一部、またはMANIFEST.inからの生成方法は無視してください。 setuptoolsはこれらの問題からユーザーを保護し、どのような場合でも同じようには機能しません。 distutilsとは異なり、setuptoolsはソース配布をビルドするたびにソース配布マニフェストファイルを再生成し、それをメインプロジェクトディレクトリの邪魔にならないように、プロジェクトの.Egg-infoディレクトリ内にビルドします。したがって、最新であるかどうかを心配する必要はありません。
ビルドが完了したら、ディレクトリを安全に削除できます。
ボーナス編集:
私の多くのPythonプロジェクトを削除するsetup.py
内のclean
コマンドをカスタマイズして、*.Egg-info
、dist
、build
、および*.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'
多田!
-Egg.info
フォルダは、必ずしも削除できる一時的なアーティファクトであるとは限りません。
たとえば、「編集可能な」インストールにpip install -e YOURPACKAGE
を使用する場合(python setup.py develop
のようなシンボリックリンクを介して機能するため、ローカルで編集するたびにパッケージを再インストールする必要はありません)、-Egg.info
フォルダーは、パッケージが別のソースにインポートされる実行時に必要です。存在しない場合は、DistributionNotFound
エラーが発生します。
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
Pythonのパッケージ化とビルドシステムが壊れています。そのため、箱から出してすぐに動作するであろうものには、多くのハックと回避策があります。
ただし、*。Egg-infoを削除するために見つけた「最もクリーンな」ハックは、通常のclean --all
スイッチとEgg_info
を使用して* .Egg-infoファイルをサブフォルダーに配置し、 cleanコマンドによってクリーニングされます。ここに例を示します:
setup.cfg
では、次のようなものを使用します。
[Egg_info]
Egg_base = ./build/lib
ここで、./build/lib
はclean --all
が削除するフォルダーです。次に、setuptoolsを使用してプロジェクトをビルドするときに、-allフラグを指定してcleanコマンドを使用します。
python setup.py bdist_wheel clean --all
ソースバンドルもビルドする場合は、sdistの前にbdist_wheelをビルドして、build/libフォルダーが存在することを確認してください。例:
python setup.py bdist_wheel sdist clean --all