2017-11-03 19 views
6

Tôi có thư viện (subx) phụ thuộc vào subprocess32. Thư viện subprocess32 là một backport cho Python2.7 và cung cấp kwarg timeout.Quản lý phụ thuộc: subprocess32 cần cho Python2.7

Thư viện của tôi cần có khoảng thời gian chờ.

Tôi chỉ cần subprocess32 nếu nền tảng đích là Python2.x.

Làm cách nào để xác định sự phụ thuộc trong dự án của tôi?

tôi nhận được thông báo lỗi này, nếu tôi xác định một phụ thuộc vào subprocess32 qua "install_requires" (setup.py) và tôi bên trong một virtualenv python3:

===> pip install -e git+https://github.com/guettli/subx.git#egg=subx 
Obtaining subx from git+https://github.com/guettli/subx.git#egg=subx 
    Cloning https://github.com/guettli/subx.git to ./src/subx 
Collecting subprocess32 (from subx) 
    Using cached subprocess32-3.2.7.tar.gz 
    Complete output from command python setup.py egg_info: 
    This backport is for Python 2.x only. 

    ---------------------------------------- 
Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-lju3nl1y/subprocess32/ 

Trả lời

6

Có một cách khai báo, nhưng nó đòi hỏi một phiên bản ít hơn hoặc gần đây hơn của setuptools (nếu tôi đọc chính xác release notes, bạn cần ít nhất phiên bản 20.2). Những gì bạn sẽ thấy dưới đây được gọi là đánh dấu môi trường và được xác định trong PEP 508, đọc nó qua để có danh sách đầy đủ các điểm đánh dấu có sẵn và hiểu rõ hơn về cú pháp điểm đánh dấu nếu bạn muốn.

Đối với phiên bản python, hãy lấy gói của bạn làm ví dụ: bạn có subprocess32 phụ thuộc nên được cài đặt trong môi trường python2.X. Tăng cường sự phụ thuộc của bạn như thế này:

install_requires=[ 
    'subprocess32; python_version<"3"', 
] 

Cài đặt gói subx với python2.7 nay mang lại:

Processing ./dist/subx-2017.8.0-py2-none-any.whl 
Collecting subprocess32; python_version < "3" (from subx==2017.8.0) 
Installing collected packages: subprocess32, subx 
Successfully installed subprocess32-3.2.7 subx-2017.8.0 

Nếu bạn cài đặt nó với python3.X, sản lượng sẽ là:

Processing ./dist/subx-2017.8.0-py3-none-any.whl 
Installing collected packages: subx 
Successfully installed subx-2017.8.0 

ý rằng việc cài đặt subprocess32 sẽ bị bỏ qua.


Một ví dụ phổ biến là để khai báo phụ thuộc nền tảng cụ thể: Tôi có một dự án đòi hỏi auditwheel phải được cài đặt trên Linux và delocate trên hệ điều hành MacOS. Tôi tuyên bố sự phụ thuộc như thế này:

install_requires=[ 
    ... 
    'auditwheel==1.7.0; "linux" in sys_platform', 
    'delocate==0.7.1; "darwin" == sys_platform', 
] 

Lưu ý rằng việc kiểm tra này dành cho Linux là cần thiết nếu bạn không nhắm tới bất kỳ phiên bản python lớn vì:

$ python2 -c "import sys; print sys.platform" 
linux2 

nhưng

$ python3 -c "import sys; print sys.platform" 
linux 

nên ví dụ: gói của bạn chỉ hoạt động với python2.X, bạn có thể sử dụng séc "linux2" == sys.platform. Điều này sẽ làm cho sự phụ thuộc của bạn có thể cài đặt chỉ với python2.X.

+0

Điều này có vẻ là một câu trả lời hoàn chỉnh. Tuy nhiên, trong cửa sổ 'sys.platform' sẽ in' win32' cho Windows và 'cygwin' cho Windows/Cygwin. –

+0

@ElisByberi afaik biểu thức cơ bản được hỗ trợ nên '" win32 "== sys_platform hoặc" cygwin "== sys_platform' sẽ hoạt động. Tuy nhiên, có các dấu môi trường khác như 'platform_system' có thể phù hợp hơn với trường hợp này. Một lần nữa, kiểm tra [PEP 508] (https://www.python.org/dev/peps/pep-0508/#environment-markers) để biết thêm chi tiết. – hoefling

5
import sys 

kw = {} 
if sys.version_info[0] == 2: 
    kw['install_requires'] = ['subprocess32'] 

setup(
    … 
    **kw 
) 
+3

Bạn nên thêm một số giải thích về cách mã của bạn hoạt động. Chỉ cần cung cấp mã không phải là phương pháp tốt nhất để học lập trình và sẽ không mang lại lợi ích cho người tạo bài đăng nhiều như nó sẽ được giải thích tốt. Câu trả lời chi tiết sẽ thiết lập sự tín nhiệm của bạn trong cộng đồng và câu trả lời của bạn sẽ thu hút được nhiều phiếu bầu. –

+0

Có, hoạt động.Nhưng tôi tự hỏi nếu có một giải pháp khai báo hơn có sẵn. Điều này trông giống như lập trình, không xác định sự phụ thuộc. Đừng hiểu lầm tôi. Cảm ơn bạn vì câu trả lời! – guettli

+0

Cách tiếp cận này sẽ chỉ hoạt động với các mã nguồn, nhưng thất bại với bánh xe. – hoefling

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