2012-03-31 34 views
11

Gist: Cách tốt nhất để phát hiện trong setup.py rằng chúng ta đang được kích hoạt bởi pip install package là gì?phát hiện pip trong setup.py

Bối cảnh: Tôi có một gói (ràng buộc cho thư viện C), mà tôi cung cấp trứng bao gồm chính thư viện đó. Trong readme/tài liệu của tôi, tôi lưu ý rằng gói này là 'easy_install-able' trên một số nền tảng nhất định. Khi xây dựng từ nguồn (ví dụ: với pip), chính thư viện đó là phụ thuộc xây dựng. Vấn đề là tôi thường xuyên nhầm lẫn người dùng nhầm lẫn rằng pip là một thay thế đầy đủ cho easy_install và mong đợi pip install package để làm việc trên các hệ thống không có thư viện hoặc thậm chí không có trình biên dịch, nơi trứng là những gì họ thực sự muốn.

Tôi muốn phát hiện rằng bản dựng đã được kích hoạt bởi pip, vì vậy tôi có thể cung cấp thông báo "pip! = Easy_install" thân thiện nếu nó không thành công do thiếu thư viện. Nó không cần phải hoàn hảo, chỉ cần nắm bắt các trường hợp phổ biến nhất của pip install package. Về thanh tra, nó không có vẻ như có một cách đặc biệt mạnh mẽ để làm điều này, và tốt nhất mà tôi đã đưa ra là:

probably_using_pip = '--single-version-externally-managed' in sys.argv 

Có cách nào tốt hơn (hoặc tốt hơn nữa, chính thức) để phát hiện pip từ setup.py?

+0

Tại sao thông báo lỗi cần phải khác biệt so với khi chạy "setup.py install" khi thư viện không có mặt? – joeforker

+0

Khi bạn chạy 'setup.py install', chắc chắn bạn đang xây dựng từ nguồn. Khi bạn chạy 'pip install' mọi người có thể mong đợi các tập tin nhị phân nhưng không nhận được chúng (người dùng thực sự không hiểu sự khác biệt giữa pip và easy_install). Câu hỏi này không còn liên quan đến trường hợp cụ thể của tôi, bởi vì pip 1.5 hỗ trợ bánh xe theo mặc định. – minrk

+0

Một số ngữ cảnh khác: tại thời điểm yêu cầu (hai năm trước), gói của tôi thường được cài đặt trên các máy không có trình biên dịch và pip không hỗ trợ định dạng nhị phân. easy_install làm việc tốt, nhưng pip sẽ không biên dịch được. Bởi vì điều này, tôi muốn thông báo cho những người có 'pip install' thất bại mà easy_install có thể thích hợp hơn. – minrk

Trả lời

-1

Có thể bạn có thể thử sử dụng subprocess/os để thử chạy pip, sau đó nếu nó không thành công, bạn biết không có pip.

+0

Nhưng nếu không, nó sẽ không có ý nghĩa gì cả. –

+3

Biết rằng pip tồn tại không giúp được gì, bởi vì tôi đang tìm kiếm liệu nó có thực sự được sử dụng hay không. Thêm vào đó, việc kiểm tra sự hiện diện của pip sẽ dễ dàng hơn là 'pips nhập khẩu'. – minrk

3

__file__ trong quá trình thiết lập cung cấp một cái gì đó như /tmp/pip-DNpsLw-build/setup.py nếu chạy từ pip.

from setuptools import setup 

def determineInstaller(): 
    if 'pip' in __file__: 
     print('========pip triggered build========') #add smiley for friendliness :) 
    return 'dummy description' 

setup(name='bla', 
     version='0.0', 
     description=determineInstaller(), 
    ) 
+1

Đó là một lưu ý khá hay khác, mặc dù tôi muốn cụ thể hơn để giảm dương tính giả, ví dụ: 'using_pip = os.path.basename (os.path.dirname (__ file __)). Startswith ('pip -')'. Do không có ai cung cấp câu trả lời được ghi chép hoặc chính thức, và không dễ bị tổn thương về các mặt tích cực sai và/hoặc thay đổi trong các API riêng, có vẻ như tác giả pip không có ý định đóng gói để có thể biết rằng pip đang được sử dụng. – minrk

+0

+1 cho sự thân thiện – Cacovsky

+1

'__file__' giải pháp dường như không hoạt động với Py 2.7 2014-10-27, không có 'pip' trong' __file__'. 'os.environ' có khóa '_' với giá trị '/ run/shm/r/ven/bin/pip'. Đây là cài đặt thông qua 'pip install -e. -U', vì vậy có lẽ giải pháp '__file__' hoạt động với các cài đặt pip điển hình hơn, nhưng có lẽ phím' _' là tổng quát hơn? –

0

Bạn đã xem xét việc xây dựng wheels mà pip có thể cài đặt không?

+0

Tôi làm bánh xe ngay bây giờ. Khi tôi hỏi câu hỏi này, bánh xe không tồn tại. – minrk

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