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 python2
và python3
.
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 cobs
PyPI hoặc BitBucket.
'easy_install' không hoạt động đối với Python 3.x – jfs
Còn' pip' thì sao? –
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). –