2010-03-08 37 views
17

Tôi có một mô-đun Python mà tôi muốn tải lên PyPI. Cho đến nay, nó đang làm việc cho Python 2.x. Nó không phải là quá khó để viết một phiên bản cho 3.x bây giờ.Cách tổ chức các mô-đun Python cho PyPI để hỗ trợ 2.x và 3.x

Nhưng, sau khi nguyên tắc để tạo module trong các địa điểm sau:

nó không phải là rõ ràng với tôi làm thế nào để hỗ trợ nhiều bản phân phối nguồn cho các phiên bản khác nhau của Python, và không rõ liệu PyPI có thể hỗ trợ nó hay không. Tôi dự tính tôi sẽ có mã riêng biệt cho:

  • 2.x
  • 2,6 (có lẽ, như một trường hợp đặc biệt để sử dụng API đệm mới)
  • 3.x

như thế nào có thể thiết lập mô-đun Python trong PyPI để ai đó có thể làm:

easy_install modulename 

và nó sẽ cài đặt đúng nếu người dùng đang sử dụng 2.x hoặc 3.x?

+0

'easy_install' không hoạt động đối với Python 3.x – jfs

+0

Còn' pip' thì sao? –

+1

Phiên bản phân phối của 'easy_install' hoạt động với Python 3.x (http://pypi.python.org/pypi/distribute). –

Trả lời

18

Tôi thấy rằng setup.py for httplib2 dường như có một cách thanh lịch để hỗ trợ Python 2.x và 3.x. Vì vậy, tôi quyết định sao chép phương pháp đó.

Nhiệm vụ là tạo một đơn setup.py để phân phối gói hoạt động với tất cả các bản phân phối Python được hỗ trợ. Sau đó, với cùng setup.py, bạn có thể làm:

python2 setup.py install 

cũng như

python3 setup.py install 

Nó nên có thể để giữ setup.py đủ đơn giản để được phân tích với tất cả các phân phối Python hỗ trợ. Tôi đã thực hiện thành công với gói cobs hỗ trợ 2,4 đến 2,6 cũng như 3.1. Gói đó bao gồm mã Python thuần túy (mã riêng cho Python 2.x và 3.x) và phần mở rộng C, được viết riêng cho 2.x và 3.x.

Để làm điều đó:

1) Tôi đặt mã 2.x Python vào một thư mục con python2, và mã Python 3.x trong thư mục con python3.

2) Tôi đặt mã mở rộng C cho 2.x và 3.x trong thư mục src dưới python2python3.

Vì vậy, cấu trúc thư mục là:

root 
    | 
    +--python2 
    |  | 
    |  +--src 
    | 
    +--python3 
    |  | 
    |  +--src 
    | 
    +--setup.py 
    +--MANIFEST.in 

3) Trong setup.py, tôi đã có những dòng gần đầu:

if sys.version_info[0] == 2: 
    base_dir = 'python2' 
elif sys.version_info[0] == 3: 
    base_dir = 'python3' 

4) Trong cuộc gọi đến setup, tôi đã chỉ định các các gói như bình thường:

setup(
    ... 
    packages=[ 'cobs', 'cobs.cobs', 'cobs.cobsr', ], 

5) Tôi đã chỉ định thư mục cơ sở cho t ông Python mã sử dụng một lựa chọn package_dir (xem lại bước 3 cho base_dir):

package_dir={ 
     'cobs' : base_dir + '/cobs', 
    }, 

6) Đối với các phần mở rộng C, tôi đã đưa ra đường dẫn:

ext_modules=[ 
     Extension('cobs.cobs._cobs_ext', [ base_dir + '/src/_cobs_ext.c', ]), 
     Extension('cobs.cobsr._cobsr_ext', [ base_dir + '/src/_cobsr_ext.c', ]), 
    ], 

Đó là về nó cho setup.py. Tệp setup.py có thể phân tích cú pháp bằng cả Python 2.x và 3.x.

7) Cuối cùng, nếu bạn xây dựng một phân phối nguồn sử dụng:

python2 setup.py sdist 

sau đó nó sẽ kéo bởi mặc định trong các file mà được đặc biệt cần thiết để xây dựng cho Python. Ví dụ. trong trường hợp trên, bạn sẽ chỉ nhận các tệp theo số python2 trong bản phân phối nguồn chứ không phải các tệp dưới python3. Nhưng đối với phân phối nguồn hoàn chỉnh, bạn muốn bao gồm các tệp cho cả 2.x và 3.x. Để làm điều đó, tạo một tệp MANIFEST.in có chứa một cái gì đó như thế này:

include *.txt 
recursive-include python2 * 
recursive-include python3 * 

để xem những gì tôi đã làm, xem mã nguồn trên cobsPyPI hoặc BitBucket.

+0

Không chắc tại sao viết lên như thế này không phải là một nơi nào đó trong một trong những hướng dẫn đã đề cập trước đó hoặc bất cứ nơi nào khác mà tôi có thể tìm thấy cho vấn đề đó. Tôi chỉ cần tải lên pkg đầu tiên của tôi để pypi, nó đã được viết cho py3 nhưng tôi muốn hỗ trợ py2 một cách hợp lý. Tôi nghĩ điều này sẽ giúp ích. – Zeb

2

Giải pháp đơn giản nhất là sử dụng phân phối nguồn đơn.

+0

Tôi có thể tạo một bản phân phối nguồn , với các thư mục ví dụ 'python2' và' python3', mỗi chứa 'setup.py' và mã mô-đun cho phiên bản Python đó. Đó có phải là ý bạn không? –

+0

Giải pháp đó có vẻ xung đột với lời khuyên "Bạn nên luôn chạy lệnh thiết lập từ thư mục gốc phân phối" trong http://docs.python.org/3.1/install/index.html#platform-variations –

+1

@Craig McQueen : chỉ có tập tin 'setup.py'. Hãy xem các gói hỗ trợ cả 2.x và 3.x trên PyPI http://pypi.python.org/pypi?:action=browse&c=5&c=531&c=533 – jfs

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