2012-06-28 27 views
5

Hiện tại một trong các gói của tôi yêu cầu bộ mã hóa/phân tích cú pháp JSON và được thiết kế để sử dụng simplejson nếu có sẵn quay trở lại mô-đun json (trong thư viện chuẩn) nếu cần thiết (như tiêu chuẩn hiển thị simplejson là nhanh hơn).Tôi có thể xác định các gói tùy chọn trong bộ cài đặt không?

Tuy nhiên, gần đây nó đã bị trúng & bỏ lỡ xem liệu simplejson sẽ cài đặt khi sử dụng zc.buildout - điều gì đó với di chuyển đến github, tôi tin. Điều đó khiến tôi băn khoăn; có thể xác định các gói tùy chọn trong tệp setup.py của tôi, nếu không có, sẽ không ngừng cài đặt gói của tôi không?

Trả lời

0

AFAIK không có cách nào để xác định gói tùy chọn và sẽ không có cách nào để thực hiện việc này. Những gì bạn mong đợi khi bạn xác định một gói tùy chọn? Rằng nó được cài đặt khi nó chưa có sẵn? (bằng cách nào đó sẽ bắt buộc)

Không, IMHO đúng cách để giải quyết vấn đề này là trong hàng nhập khẩu của bạn nơi bạn muốn sử dụng gói. Ví dụ:

try: 
    from somespecialpackage import someapi as myapi 
except ImportError: 
    from basepackage import theapi as myapi 

Điều này tất nhiên đòi hỏi rằng hai API tương thích, nhưng đây là trường hợp với simplejson và tiêu chuẩn thư viện json gói.

+2

Tùy chọn có nghĩa là nếu gói không cài đặt, cài đặt có thể hoàn thành không bị cản trở. –

+0

Được rồi, nhưng nếu bạn không * vitaly dựa vào một gói, tại sao lại đặt nó trong các gói * bắt buộc *? Tôi chỉ đơn giản là không nhận được điểm. – Constantinius

+0

Tôi không muốn đặt nó vào danh sách 'yêu cầu'; đó là những gì tôi đang hỏi - liệu có một tùy chọn khác để tôi có thể đưa nó vào nếu có, nhưng bỏ qua nếu không? –

6

gói tùy chọn tại thời điểm cài đặt.

Tôi giả định bạn đang nói về tập lệnh setup.py của mình. Bạn có thể thay đổi nó để có:

# mypackage/setup.py 

extras = { 
    'with_simplejson': ['simplejson>=3.5.3'] 
} 

setup(
    ... 
    extras_require=extras, 
    ...) 

sau đó bạn có thể làm một trong hai:

  • pip install mypackage,
  • pip install mypackage[with_simplejson]

với sau này cài đặt simplejson>=3.5.3.

Thay vì cố cài đặt mọi thứ và dự phòng cho một phiên bản đã biết, bạn sẽ muốn cài đặt tập hợp con các gói bạn biết làm việc.

gói tùy chọn vào thời gian thực hiện.

Khi bạn có hai bộ gói khác nhau có thể được cài đặt, bạn cần để đảm bảo bạn có thể sử dụng chúng nếu chúng có sẵn. Ví dụ. cho json nhập khẩu của bạn:

try: 
    # helpful comment saying this should be faster. 
    import simplejson as json 
except ImportError: 
    import json 

Một ví dụ khác phức tạp hơn:

try: 
    # xml is dangerous 
    from defusedxml.cElementTree import parse 
except ImportError: 
    try: 
     # cElementTree is not available in older python 
     from xml.cElementTree import parse 
    except ImportError: 
     from xml.ElementTree import parse 

Nhưng bạn cũng có thể tìm thấy mô hình này trong một số gói:

try: 
    optional_package = None 
    import optional.package as optional_package 
except ImportError: 
    pass 

... 

if optional_package: 
    # do addtional behavior 
Các vấn đề liên quan