2013-02-22 37 views
173

Có thể cài đặt gói bằng pip từ hệ thống tệp cục bộ không?Cài đặt gói Python từ thư mục hệ thống tệp cục bộ bằng pip

Tôi đã chạy python setup.py sdist cho gói của mình, đã tạo tệp tar.gz thích hợp. Tệp này được lưu trữ trên hệ thống của tôi tại /srv/pkg/mypackage/mypackage-0.1.0.tar.gz.

Bây giờ trong môi trường ảo, tôi muốn cài đặt các gói đến từ pypi hoặc từ vị trí địa phương cụ thể /srv/pkg.

Điều này có khả thi không?

PS Tôi biết rằng tôi có thể chỉ định pip install /srv/pkg/mypackage/mypackage-0.1.0.tar.gz. Điều đó sẽ hiệu quả, nhưng tôi đang nói về việc sử dụng vị trí /srv/pkg làm nơi khác để tìm đường ống nếu tôi nhập pip install mypackage.

+0

tôi đang tìm kiếm để cài đặt một gói PyPi mà không setup.py, từ bánh xe WHL, và nó đã được cài đặt sau khi tôi tải xuống phiên bản đúng cho phiên bản Python của mình và chạy 'pip install '. –

+0

Liên quan: [Làm thế nào để pip cài đặt gói theo requirements.txt từ một thư mục địa phương?] (Http://stackoverflow.com/q/7225900/95735) –

Trả lời

74

Tôi khá chắc chắn rằng những gì bạn đang tìm kiếm được gọi là tùy chọn --find-links.

Mặc dù bạn có thể cần phải tạo một giả index.html cho chỉ mục gói địa phương của bạn liệt kê các liên kết đến tất cả các gói. Công cụ này giúp:

https://github.com/wolever/pip2pi

+47

'pip cài đặt mypackage --no-index --find-links file: /// srv/pkg/mypackage' sẽ hoạt động. – jfs

+0

Điều đó có hiệu quả. Nó không phải là lý tưởng, nhưng nó là khá tốt. Cảm ơn. – chadgh

+1

Nó giúp đỡ. Và chúng ta có thể sử dụng tùy chọn * -i * của pip để xử lý nó như là một PyPI cục bộ. – diabloneo

290

gì về ::

pip install --help 
... 
    -e, --editable <path/url> Install a project in editable mode (i.e. setuptools 
           "develop mode") from a local project path or a VCS url. 

ví dụ, pip install -e /srv/pkg

nơi/srv/pkg là thư mục cấp cao nhất nơi 'setup.py' có thể là tìm.

+28

Điều này sẽ cài đặt gói ở chế độ phát triển, nghĩa là nó sẽ chỉ liên kết ngược lại đến nơi các nguồn là. Nếu có khả năng các nguồn được di chuyển hoặc bị xóa, việc nhập gói sẽ không thành công. –

+2

@MarcoDinacci Điều thú vị về '--editable' là có vẻ như nhìn vào thư mục của gói địa phương và thiết lập nguồn như là một repo git nếu có một - linh hoạt hơn một chút so với chỉ một thư mục. Tôi không thể tìm thấy tài liệu cho điều này mặc dù. – Simon

+0

Hoạt động tốt trên các cửa sổ. Nên là câu trả lời được chấp nhận. – miguelr

17

Đây là giải pháp mà tôi đã kết thúc bằng:

import pip 


def install(package): 
    # Debugging 
    # pip.main(["install", "--pre", "--upgrade", "--no-index", 
    #   "--find-links=.", package, "--log-file", "log.txt", "-vv"]) 
    pip.main(["install", "--upgrade", "--no-index", "--find-links=.", package]) 


if __name__ == "__main__": 
    install("mypackagename") 
    raw_input("Press Enter to Exit...\n") 

Tôi chắp này với nhau từ pip install examples cũng như từ Rikard's answer trên another question. Đối số "--pre" cho phép bạn cài đặt các phiên bản không sản xuất. Đối số "--no-index" tránh tìm kiếm các chỉ mục PyPI. "--find-links =." tìm kiếm đối số trong thư mục cục bộ (điều này có thể là tương đối hoặc tuyệt đối). Tôi đã sử dụng đối số "--log-file", "log.txt" và "-vv" để gỡ lỗi. Đối số "--upgrade" cho phép bạn cài đặt các phiên bản mới hơn so với phiên bản cũ hơn.

Tôi cũng tìm thấy cách tốt để gỡ cài đặt chúng. Điều này rất hữu ích khi bạn có nhiều môi trường Python khác nhau. Đó là định dạng cơ bản giống nhau, chỉ cần sử dụng "gỡ bỏ" thay vì "cài đặt", với một biện pháp an toàn để ngăn chặn uninstalls ngoài ý muốn:

import pip 


def uninstall(package): 
    response = raw_input("Uninstall '%s'? [y/n]:\n" % package) 
    if "y" in response.lower(): 
     # Debugging 
     # pip.main(["uninstall", package, "-vv"]) 
     pip.main(["uninstall", package]) 
    pass 


if __name__ == "__main__": 
    uninstall("mypackagename") 
    raw_input("Press Enter to Exit...\n") 

Các thư mục địa phương chứa những tập tin này: install.py, uninstall.py, mypackagename- 1.0.zip

+1

Cảm ơn. "--find-links =." và "--no-index", trong đó khóa gắn cùng một tập lệnh python bên trong gói tiện ích của tôi, đầu tiên loại bỏ gói phiên bản cũ khỏi các gói trang web, sau đó cài đặt gói tar.gz'ed từ một thư mục con của tiện ích-package-folder (không biết về --find-links =.), sau đó tạo bánh xe và cài đặt nó. Tất cả tự động thông qua plumbum và click. Nếu ai đó muốn nó, tôi sẽ đăng một liên kết. Được thăng hạng. – user3469861

15

Tôi đang lắp đặt pyfuzzy. Nó không có trong PyPI, "Không tìm thấy phân phối phù hợp cho pyfuzzy". Tuy nhiên, tôi thử câu trả lời được chấp nhận

pip install --no-index --find-links=file:///Users/victor/Downloads/pyfuzzy-0.1.0 pyfuzzy 

Nó cũng không thể hoạt động.Kết quả là:

chỉ số Lờ đi: https://pypi.python.org/simple Thu pyfuzzy Không thể tìm thấy một phiên bản đó đáp ứng các pyfuzzy yêu cầu (từ phiên bản:) Không phân phối hợp tìm thấy cho pyfuzzy

Cuối cùng, tôi tìm một cách đơn giản. https://pip.pypa.io/en/latest/reference/pip_install.html

Install a particular source archive file. 
$ pip install ./downloads/SomePackage-1.0.4.tar.gz 
$ pip install http://my.package.repo/SomePackage-1.0.4.zip 

pip install ../pyfuzzy-0.1.0.tar.gz. Bây giờ hoạt động tốt. Hy vọng giúp bạn.

1

Tùy chọn --find-links thực hiện công việc và hoạt động từ requirements.txt tệp!

Bạn có thể đặt tài liệu lưu trữ gói trong một số thư mục và mất một mới nhất mà không thay đổi các tập tin yêu cầu, ví dụ requirements:

. 
└───requirements.txt 
└───requirements 
    ├───foo_bar-0.1.5-py2.py3-none-any.whl 
    ├───foo_bar-0.1.6-py2.py3-none-any.whl 
    ├───wiz_bang-0.7-py2.py3-none-any.whl 
    ├───wiz_bang-0.8-py2.py3-none-any.whl 
    ├───base.txt 
    ├───local.txt 
    └───production.txt 

Bây giờ trong requirements/base.txt đặt:

--find-links=requirements 
foo_bar 
wiz_bang>=0.8 

Một cách gọn gàng để cập nhật các gói độc quyền, chỉ cần thả một gói mới vào thư mục

Bằng cách này, bạn có thể cài đặt gói từ local folderpypi với cùng một cuộc gọi: pip install -r requirements/production.txt

PS. Xem ngã ba cokiecutter-djangopackage của tôi để xem cách tách yêu cầu và sử dụng tổ chức yêu cầu dựa trên thư mục.

25

Điều này rất đơn giản. Lệnh gì bạn cần là:

pip install -e <DIRECTORY> 

Lưu ý rằng thư mục phải có một tập tin setup.py trong đó

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