3

我正在使用 setup.py 安装一个包:

python setup.py install

__init__.py正在安装的包中包含一些包级别检查,其中一项检查属性是否在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__.pyPython 包中所做的 - 这是导入包时运行的内容)。

您可以将您setup.py的版本更改为静态字符串(并记住在发布时更新它),一切都会正常工作。

于 2012-09-12T07:41:21.007 回答