我正在使用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')
答案 0 :(得分: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
文件中(某些示例here和here)。 Django项目确实使用__import__
trick,但它是__init__.py
only contains the version information,没有别的。
答案 1 :(得分:4)
version=__import__('lock').__version__
您正在导入您的软件包以获取版本,但为了导入它,__init__.py
运行(因为这是__init__.py
在Python软件包中的作用 - 它是在程序包运行时运行的是进口的。)
您可以将setup.py
的版本更改为静态字符串(并记住在发布时更新它),一切都会正常工作。