2013-07-22 34 views
12

Sau khi đọc tài liệu python (http://www.python.org/dev/peps/pep-0396/) Tôi đã nhầm lẫn hơn trước về cách đặt thuộc tính __version__ cho các gói thích hợp. Nó được đề cập để đưa chúng vào tập tin setup.py, loại confuses tôi: nó sẽ không có sẵn như là my_package.__version__, phải không?Tạo thuộc tính __version__ cho gói python mà không gặp rắc rối

Tôi đã kết thúc nhập thuộc tính phiên bản từ một tệp riêng biệt.

Vì vậy "phiên bản" của tôi tập tin thường là

my_package/ 
    __init__.py 
    my_module1/ 
     ... 
    my_module2/ 
     ... 
    my_module3/ 
     ... 
    info/ 
     __init__.py 
     version.py 
      __version__ = '0.1.0' 

và trong những phòng trên __init__.py tôi nhập khẩu các __version__ thuộc tính từ info.version:

import __version__

để người ta có thể có được số phiên bản qua

my_package.__version__ 

Tôi chỉ băn khoăn liệu đây có phải là cách tiếp cận "ổn" không, và nếu có điều gì đó chống lại việc làm như thế này thì sao? Tôi rất mong nhận được ý kiến ​​và đề xuất của bạn!

+5

Liên quan chặt chẽ: [cách chính xác để chia sẻ gói là gì phiên bản với setup.py và gói?] (http://stackoverflow.com/q/17583443), yêu cầu bạn sử dụng 'setuptools' thay vì' distutils'. Không, cài đặt phiên bản trong 'setup.py' sẽ không làm cho nó có sẵn dưới dạng' my_package .__ version__'. –

+0

Tôi sẽ kiểm tra các chủ đề khác, cảm ơn bạn! – Sebastian

Trả lời

1

Bạn chưa biết cách bạn lấy số phiên bản vào setup.py, nhưng đừng cố gắng nhập số đó theo cách tiếp cận thông thường import my_package. Gói của bạn chưa được cài đặt khi bạn chạy setup.py!

Cách tiếp cận thông thường của tôi là xác định số phiên bản trong setup.py và setup.py (lại) tạo tệp cấp cao nhất của gói __init__.py khi số phiên bản thay đổi. Điều này rất dễ thực hiện nếu tệp __init__.py không chứa mã nào khác.

+1

Có, âm thanh đó giống như một hack có thể hoạt động! Ngay bây giờ, về cơ bản tôi đã có một số phiên bản được định nghĩa trong 'setup.py' và một trong' __init __. Py' - nó hoạt động tốt cho đến khi bạn quên thay đổi một trong hai khi bạn cập nhật gói ...: P – Sebastian

4

Một giải pháp là xác định __version__ trong tệp __init__.py của bạn và đọc từ bên trong setup.py. Điều này có nghĩa là bạn chỉ phải thay đổi phiên bản ở một vị trí. Tôi đã viết một chức năng nhỏ sẽ làm điều này:

from setuptools import setup 
import re 

def get_property(prop, project): 
    result = re.search(r'{}\s*=\s*[\'"]([^\'"]*)[\'"]'.format(prop), open(project + '/__init__.py').read()) 
    return result.group(1) 

project_name = 'YOUR PROJECT' 
setup(
    ..., 
    version = get_property('__version__', project_name), 
    ..., 
) 

bạn cũng có thể sử dụng để lấy những thứ như __author__ hoặc bất cứ điều gì khác quy định tại các __init__.py tập tin

Các vấn đề liên quan