2013-06-24 22 views
10

Giả sử rằng bạn đã cài đặt pip hoặc easy_install trên bản phân phối python của mình, tôi muốn biết cách cài đặt gói yêu cầu trong thư mục người dùng từ bên trong tập lệnh.Làm thế nào để cài đặt một gói python thiếu từ bên trong kịch bản cần nó?

Từ những gì tôi biết pip cũng là một mô-đun python vì vậy giải pháp nên hình như:

try: 
    import zumba 
except ImportError: 
    import pip 
    # ... do "pip install --user zumba" or throw exception <-- how? 
    import zumba 

Những gì tôi đang mất tích đang làm "PIP cài đặt zumba --user" từ bên trong python, tôi không muốn làm điều đó bằng cách sử dụng os.system() vì điều này có thể tạo ra các sự cố khác.

tôi giả sử nó có thể ...

+1

Làm thế nào về giải pháp này: http://stackoverflow.com/questions/12332975/installing-python-module-within-code –

+2

Tôi nghĩ rằng đây sẽ là một rất thực hành mã hóa không mong muốn bên ngoài tập lệnh thiết lập. Tôi (như tôi đoán hầu hết mọi người) sẽ không thích/tin tưởng bất kỳ chương trình nào mà tôi chạy để thay đổi môi trường của tôi. Các công cụ như pip và virtualenv được đặc biệt ở đó để "người dùng" có quyền kiểm soát gói nào được cài đặt xuống phiên bản nào. Không phải là một chuyên gia về mâu thuẫn nhưng tôi biết rằng nó có các cơ sở để liệt kê các yêu cầu tiên quyết cho bất kỳ gói nào. Nếu nó chỉ là để sử dụng của riêng bạn, bạn có thể có thể munge một chút của mã đó. – Joop

+0

Cảm ơn các bạn, nó hoạt động hoàn hảo. Như một lưu ý, đó là một giải pháp tốt cho các kịch bản độc lập, không phải mô-đun/gói. – sorin

Trả lời

14

Nhờ @Joop tôi đã có thể đi lên với câu trả lời thích hợp.

try: 
    import zumba 
except ImportError: 
    import pip 
    pip.main(['install', '--user', 'zumba']) 
    import zumba 

Một lưu ý quan trọng là việc này sẽ hoạt động mà không yêu cầu quyền truy cập root vì nó sẽ cài đặt mô-đun trong thư mục người dùng.

Không chắc chắn nếu nó sẽ làm việc cho mô-đun nhị phân hoặc những người sẽ yêu cầu biên dịch, nhưng nó hoạt động rõ ràng cho các mô-đun tinh khiết-python.

Bây giờ bạn có thể viết các tập lệnh khép kín và không phải lo lắng về các phụ thuộc.

+0

Điều này làm việc cho tôi để cài đặt 'boto3' trên dịch vụ PythonAnywhere. Có vẻ như pip.main() chỉ là một trình bao bọc xung quanh công cụ dòng lệnh, thay vì cung cấp một API. Loại xấu xí, nhưng chức năng tôi giả sử. Tôi đã nhận được một thông báo "truy cập bị từ chối", cho đến khi tôi thêm '--user'. –

1

Tôi muốn lưu ý rằng câu trả lời được chấp nhận hiện tại có thể dẫn đến xung đột tên ứng dụng có thể xảy ra. Nhập từ không gian tên ứng dụng không cung cấp cho bạn bức tranh đầy đủ về những gì được cài đặt trên hệ thống.

Cách tốt hơn sẽ là:

import pip 

packages = [package.project_name for package in pip.get_installed_distributions()] 

if 'package' not in packages: 
    pip.main(['install', 'package']) 
Các vấn đề liên quan