2012-09-12 2 views
3

나는 setup.py를 사용하여 패키지를 설치 해요 :setup.py가 설치하는 동안 __init__.py 모듈을 실행하는 이유는 무엇입니까?

python setup.py install 

내 내가 설치가 그것의 하나는 속성이 settings.py에서 사용할 수 있는지 여부를 확인, 일부 패키지 수준의 검사를 포함하고있어 패키지에 __init__.py. 재배포 가능 패키지이기 때문에 settings.py은 패키지를 통해 전달되지 않지만 사용자는 프로젝트 전반의 settings.py에서 올바르게 설정되었는지주의해야합니다. 전화 setup.py install__init__.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 만 복사 내 패키지 그 코드를 실행하지 않습니다. 내 패키지를 사용하는 다른 앱이 내 패키지를 코드로 가져올 때마다 코드가 실행되어야합니다.

편집 : 요청에 따라 포함 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

패키지를 가져올 때 실제로 "실행"하는 경우와 상관없이'__init __. py'가 호출됩니다. 그럼 어디서나 가져 오는거야? –

+0

역 추적 및 'setup.py'의 세부 사항을 포함하십시오. –

답변

7

setup.py은 python으로 실행 가능합니다. 이것은 파이썬 스크립트로 실행되어 패키지 배포 구성을 찾습니다.

귀하의 setup.py 실행이 코드 :

version=__import__('lock').__version__, 

이것은 당신의 lock 패키지를 가져, 그래서 패키지의 __init__.py 파일이로드됩니다. 전화를 끊으면 설치가 완료됩니다. 대신 다른 버전을 저장하십시오. 트랙백은 심지어 명시 적으로 알려줍니다

참고 :

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

모범 사례 대신 setup.py 파일의 버전 (몇 가지 예 herehere)를 저장하는 것입니다. Django 프로젝트는 __import__ trick을 사용하지만, __init__.pyonly contains the version information 일뿐입니다.

+0

두 분 모두에게 감사드립니다. 나는 상세한 정보/추가 자료가 있기 때문에이 대답을 받아 들였다. –

4
version=__import__('lock').__version__ 
당신은 버전을하기 위해 패키지를 가져 오는

하지만 순서 이를 가져 오려면 __init__.py이 실행됩니다 (이는 __init__.py이 Python 패키지에서 수행하기 때문에 패키지를 가져올 때 실행됩니다).

setup.py 님의 버전을 정적 문자열로 변경하면 (출시 할 때 업데이트해야 함) 모든 것이 정상적으로 작동합니다.

관련 문제