3

setup.pyを使用してパッケージをインストールしています:

python setup.py install

__init__.pyインストールしているパッケージには、いくつかのパッケージレベルのチェックが含まれています。そのうちの1つは、で属性が使用可能かどうかをチェックしますsettings.py。再配布可能なパッケージであるためsettings.py、パッケージを介して配信されませんが、ユーザーは、プロジェクト全体のsettings.pyで設定が正しく設定されていることに注意する必要があります。

from django.core.exceptions import ImproperlyConfigured
from django.conf import settings

#check if settings are properly set
if not hasattr(settings, 'PACKAGE_SPECIFIC_SETTING'):
    raise ImproperlyConfigured('Please add the PACKAGE_SPECIFIC_SETTING setting to your settings.py')

今、私はなぜ呼び出しsetup.py installが実行されるのか疑問に思っています__init__.py(そして、それほど驚くことではありませんが、設定が見つからないためにクラッシュします)。

私はsetup.py自分のパッケージをコピーするだけで、コードを実行しないと思っていたでしょう。私のパッケージを使用している別のアプリが私のパッケージを彼のコードにインポートするたびに、コードを実行する必要があります。

編集:要求に応じてsetup.pyを含めました

#!/usr/bin/env python
# vim: ai ts=4 sts=4 et sw=4 coding=utf-8


from distutils.core import setup

setup(
    name='django-simple-lock',
    version=__import__('lock').__version__,
    license = 'GNU Lesser General Public License (LGPL), Version 3',

    requires = ['python (>= 2.5)', 'django (>= 1.3)'],
    provides = ['lock'],

    description='Simple locking implementation as a reusable'
                'Django app.',
    long_description=open('README.rst').read(),

    url='http://github.com/mr-stateradio/django-simple-lock',

    packages=['lock', 'lock.tests'],

    classifiers = [
        'Development Status :: 4 - Beta',
        'Environment :: Web Environment',
        'Framework :: Django',
        'Intended Audience :: Developers',
        'License :: OSI Approved :: GNU Library or Lesser General Public License (LGPL)',
        'Programming Language :: Python',
        'Topic :: Database',
        'Topic :: Software Development :: Libraries :: Python Modules',
    ],
)

編集:含まれているトレースバック:

/Users/Me/.virtualenvs/django1_4/bin/python setup.py install
Traceback (most recent call last):
  File "setup.py", line 9, in <module>
    version=__import__('lock').__version__,
  File "/01_Development/django-simple-lock/lock/__init__.py", line 8, in <module>
    raise ImproperlyConfigured('Please add the PACKAGE_SPECIFIC_SETTING setting to your settings.py')
4

2 に答える 2

7

あなたsetup.pyは実行可能なPythonです。これは、Pythonスクリプトとして実行され、パッケージ配布構成を検出します。

次のsetup.pyコードを実行します。

    version=__import__('lock').__version__,

これによりパッケージがインポートさlockれるため、__init__.pyそのパッケージ内のファイルがロードされます。その呼び出しを削除すると、セットアップは成功します。代わりに、バージョンを別の場所に保存してください。

トラックバックはあなたにそのように明示的にさえ告げることに注意してください:

  File "setup.py", line 9, in <module>
    version=__import__('lock').__version__,

ベストプラクティスは、setup.py代わりにバージョンをファイルに保存することです(ここここにいくつかの例があります)。Djangoプロジェクトはこの__import__トリックを使用しますが、バージョン情報__init__.py のみが含まれ、他には何も含まれていません。

于 2012-09-12T07:41:40.300 に答える
4
version=__import__('lock').__version__

バージョンを取得するためにパッケージをインポートしていますが、それをインポートするために__init__.py実行されます(これ__init__.pyは、Pythonパッケージで行われることであり、パッケージがインポートされたときに実行されるためです)。

のバージョンを静的な文字列に変更するだけでsetup.py(リリース時に更新することを忘れないでください)、すべてが正常に機能します。

于 2012-09-12T07:41:21.007 に答える