Cài đặt gói Python vào một thư mục khác bằng pip?


433

Tôi biết câu trả lời rõ ràng là sử dụng virtualenv và virtualenvwrapper, nhưng vì nhiều lý do tôi không thể / không muốn làm điều đó.

Vậy làm cách nào để sửa đổi lệnh

pip install package_name

để thực hiện pipcài đặt gói ở đâu đó ngoài mặc định site-packages?



2
Bây giờ câu hỏi số hai: khi bạn đã cài đặt vào một thư mục tùy chỉnh, làm thế nào để pipKHÔNG cố xóa và phiên bản cũ hơn khỏi một thư mục không tùy chỉnh. Ví dụ: một hệ thống toàn hệ thống, nơi bạn không có quyền ghi. Cho đến nay tôi chỉ thực hiện điều này với easy_install...
Tomasz Gandor

2
@TomaszGandor Tôi nghĩ rằng việc sử dụng --ignore-installedtùy chọn sẽ ngăn pip cố gắng gỡ cài đặt các gói đã cài đặt.
Piotr Dobrogost

Xin lỗi, tôi là người mới với pip, nhưng câu hỏi của bạn có giống như hỏi "làm thế nào để cài đặt pi vào một phiên bản khác của python" không? Tôi có python 3.4 và 3.5 nhưng tôi muốn cài đặt pip của mình vào python 3.5.
Charlie Parker

@Charlie Không, câu hỏi khác nhau. Tôi không biết đủ về cài đặt / ý định của bạn, nhưng nói chung tôi có thể sẽ sử dụng virtualenvwrapper và tạo một môi trường ảo với thứ gì đó nhưmkvirtualenv --python=/usr/bin/python3.5 env_name
Monika Sulik

Câu trả lời:


334

Sử dụng:

pip install --install-option="--prefix=$PREFIX_PATH" package_name

Bạn cũng có thể muốn sử dụng --ignore-installedđể buộc tất cả các phụ thuộc phải được cài đặt lại bằng cách sử dụng tiền tố mới này. Bạn có thể sử dụng --install-optionnhiều lần để thêm bất kỳ tùy chọn nào bạn có thể sử dụng python setup.py install( --prefixcó thể là những gì bạn muốn, nhưng có rất nhiều tùy chọn bạn có thể sử dụng).


5
Nếu bạn làm điều này, có cách nào pip freezeđể xem thư mục thay thế không?
Nga

7
Pip đóng băng nhìn trên đường dẫn, vì vậy nếu bạn muốn PYTHONPATH=$PREFIX_PATH/lib/python2.6/site-packages pip freezexem chúng.
Ian Bicking

4
Việc sử dụng --prefix=$PREFIX_PATHdường như không cho phép có toàn quyền kiểm soát thư mục cài đặt vì có hậu tố cụ thể của hệ thống được thêm vào nó ( \Lib\site-packagesví dụ trên Windows). Có cách nào để xác định thư mục cụ thể?
Piotr Dobrogost

1
@Piotr: vâng, có câu trả lời của tôi. Sử dụng '--prefix' hơi thô, nhưng hoạt động tốt nếu bạn muốn con trăn thuần của mình đi theo /usr/lib/pythonX.Y/site-packages thay vì /usr/local/lib/pythonX.Y/site- gói.
Anthon

79
Không phải là một câu trả lời tồi 4 năm trước, nhưng tùy chọn --target tồn tại ngay bây giờ.
Tritium21

545

Công tắc --target là thứ bạn đang tìm kiếm:

pip install --target=d:\somewhere\other\than\the\default package_name

Nhưng bạn vẫn cần thêm d:\somewhere\other\than\the\defaultvào PYTHONPATHđể thực sự sử dụng chúng từ vị trí đó.

-t, --target <dir>
Cài đặt gói vào <dir>. Theo mặc định, điều này sẽ không thay thế các tệp / thư mục hiện có trong <dir>.
Sử dụng - nâng cấp để thay thế các gói hiện có trong <dir> bằng các phiên bản mới.


Nâng cấp pip nếu công tắc mục tiêu không khả dụng:

Trên Linux hoặc OS X:

pip install -U pip

Trên Windows (điều này hoạt động xung quanh một vấn đề ):

python -m pip install -U pip

8
@DanH chạy pip install --upgrade pip!
r3m0t

16
Đây là câu trả lời đúng, đó chỉ là tùy chọn được thêm vào khá nhiều sau câu trả lời được chấp nhận.
bukzor

5
Sự khác biệt giữa --install-option="--prefix=$PREFIX_PATH"được đề cập bởi @Ian Bicking và --target=$PATHtùy chọn là gì?
Hibou57

6
targetlà một tùy chọn pip và mọi thứ bạn đặt vào install-optionsẽ được chuyển cho setup.py install command. Về cơ bản targetlà vị trí gói trang web tùy chỉnh.
Janusz Skonieczny

10
Việc sử dụng --targetcó thể dẫn đến cài đặt một phần, vì nó sẽ không cài đặt bất kỳ tập tin / tập tin dữ liệu nào trong tiền tố được chỉ định. Nó có vẻ như đi --prefixvới --install-optionlà cách duy nhất thích hợp để có toàn quyền kiểm soát các cài đặt sử dụng tiền tố.
Kenneth Hoste

73

Thay vì --targettùy chọn hoặc --install-optionstùy chọn, tôi đã thấy rằng các cách sau hoạt động tốt (từ thảo luận về một lỗi liên quan đến chính điều này tại https://github.com/pypa/pip/issues/446 ):

PYTHONUSERBASE=/path/to/install/to pip install --user

(Hoặc đặt PYTHONUSERBASEthư mục trong môi trường của bạn trước khi chạy lệnh, sử dụng export PYTHONUSERBASE=/path/to/install/to)

Này sử dụng rất hữu ích --usertùy chọn nhưng nói với nó để làm cho bin, lib, sharevà các thư mục khác bạn mong muốn dưới một tiền tố tùy chỉnh hơn$HOME/.local .

Sau đó, bạn có thể thêm video này vào bạn PATH, PYTHONPATHvà các biến khác như bạn làm một thư mục cài đặt bình thường.

Lưu ý rằng bạn cũng có thể cần chỉ định --upgrade--ignore-installedcác tùy chọn nếu có bất kỳ gói nào phụ thuộc vào yêu cầu các phiên bản mới hơn được cài đặt trong PYTHONUSERBASEthư mục, để ghi đè các phiên bản do hệ thống cung cấp.

Một ví dụ đầy đủ:

PYTHONUSERBASE=/opt/mysterypackage-1.0/python-deps pip install --user --upgrade numpy scipy

.. để cài đặt scipynumpygói các phiên bản gần đây nhất vào một thư mục mà sau đó bạn có thể đưa vào PYTHONPATHnhư vậy (sử dụng bash và cho python 2.6 trên CentOS 6 cho ví dụ này):

export PYTHONPATH=/opt/mysterypackage-1.0/python-deps/lib64/python2.6/site-packages:$PYTHONPATH
export PATH=/opt/mysterypackage-1.0/python-deps/bin:$PATH

Sử dụng virtualenv vẫn là một giải pháp tốt hơn và gọn gàng hơn!


4
Điều này hoạt động với Travis CI chạy trên các container Docker trong khi giải pháp --install-option = "- prefix = $ PREFIX_PATH" thì không.
32 bit

1
Câu hỏi của Noobie, tầm quan trọng của /binthư mục pip tạo ra, --usertạo ra nó như thế nào --PREFIXtrong khi --targetkhông.
Jonathan

1
Nếu gói được cài đặt trong Python toàn cầu, --ignore-installedlà cần thiết.
George Sovetov

1
Tùy chọn này cũng tương thích với --editablevà cài đặt cục bộ.
mdh

1
Tùy chọn này có ích để cài đặt các gói như siêu người dùng cho một người dùng không phải root khác mà không phải suloanh quanh (ví dụ có thể có vấn đề trong các thùng chứa).
mdh

43

Cài đặt gói Python thường chỉ bao gồm một số tệp Python thuần túy. Nếu gói bao gồm dữ liệu, tập lệnh và hoặc tệp thực thi, chúng được cài đặt trong các thư mục khác nhau từ các tệp Python thuần túy.

Giả sử gói của bạn không có dữ liệu / tập lệnh / tệp thực thi và bạn muốn các tệp Python của mình đi vào /python/packages/package_name(và không phải là một số thư mục con một vài cấp dưới đây/python/packages khi sử dụng --prefix), bạn có thể sử dụng lệnh một lần:

pip install --install-option="--install-purelib=/python/packages" package_name

Nếu bạn muốn tất cả (hoặc hầu hết) các gói của bạn đến đó, bạn có thể chỉnh sửa ~/.pip/pip.conf để bao gồm:

[install]
install-option=--install-purelib=/python/packages

Bằng cách đó, bạn không thể quên về việc phải xác định nó nhiều lần.

Bất kỳ tập tin / dữ liệu / tập lệnh nào được bao gồm trong gói sẽ vẫn đi đến các vị trí mặc định của chúng trừ khi bạn chỉ định các tùy chọn cài đặt bổ sung ( --prefix/ --install-data/ --install-scripts, v.v., để biết chi tiết xem các tùy chọn cài đặt tùy chỉnh ).


1
Một điểm cộng lớn cho tập tin cấu hình. Cá nhân tôi chỉ định --prefixở đó, bởi vì tôi có một thư mục "cục bộ" trên một máy chủ được chia sẻ trong thư mục chính và nó được sử dụng làm tiền tố easy_installtrước khi tôi chuyển đến pip. Hệ thống $PATH$PYTHONPATHđã được cấu hình trước đó. Thay vì install-option=--install-purelib=/blahtarget=/blahtùy chọn / chuyển đổi mới hơn này . Nó cũng tốt, nhưng đôi khi bạn chỉ cần một sự thay thế --prefix, mà bạn sẽ sử dụng với setup.pyhoặc easy_install.
Tomasz Gandor


18

Dường như không ai đề cập đến tùy chọn -t nhưng dễ nhất:

pip install -t <direct directory> <package>

8
Các -ttùy chọn là phiên bản ngắn của --targettùy chọn đã được mô tả trong một câu trả lời ( stackoverflow.com/a/19404371/594053 ) :)
MattiSG

14

Chỉ cần thêm một điểm vào câu trả lời của @Ian Bicking:

Sử dụng --usertùy chọn để chỉ định thư mục đã cài đặt cũng hoạt động nếu một người muốn cài đặt một số gói Python vào thư mục chính của một người (không có quyền người dùng sudo) trên máy chủ từ xa.

Ví dụ,

pip install --user python-memcached

Lệnh sẽ cài đặt gói vào một trong các thư mục được liệt kê trong PYTHONPATH của bạn.


14

Đã thử nghiệm các tùy chọn này với python3.5 và pip 9.0.3:

cài đặt pip --target / myfolder [gói]

Cài đặt TẤT CẢ các gói bao gồm cả phụ thuộc dưới / myfolder. Không tính đến việc các gói phụ thuộc đã được cài đặt ở nơi khác trong Python. Bạn sẽ tìm thấy các gói từ / myfolder / [pack_name]. Trong trường hợp bạn có nhiều phiên bản Python, điều này không tính đến điều đó (không có phiên bản Python trong tên thư mục gói).

cài đặt pip --prefix / myfolder [gói]

Kiểm tra là phụ thuộc đã được cài đặt. Sẽ cài đặt các gói vào /myfolder/lib/python3.5/site-packages/[packages]

cài đặt pip --root / myfolder [gói]

Kiểm tra các phụ thuộc như --prefix nhưng vị trí cài đặt sẽ là /myfolder/usr/local/lib/python3.5/site-packages/[package_name].

cài đặt pip --user [gói]

Sẽ cài đặt các gói vào $ HOME: /home/[USER[/.local/lib/python3.5/site-packages Tìm kiếm Python tự động từ đường dẫn .local này để bạn không cần đặt nó vào PYTHONPATH của mình.

=> Trong hầu hết các trường hợp - người dùng là lựa chọn tốt nhất để sử dụng. Trong trường hợp thư mục nhà không thể được sử dụng vì một số lý do sau đó --prefix.


Chạy theo python 2.7.16, --target (hoặc --prefix) cài đặt Jinja2-2.10.1.dist-information / ví dụ, trong khi cài đặt --install-option = "- tiền tố cài đặt Jinja2-2.10.1-py2 .7.egg-thông tin /, đó là những gì tôi thực sự muốn
Greg Dougherty

13

Các phiên bản mới hơn của pip(8 trở lên) có thể trực tiếp sử dụng --prefixtùy chọn :

pip install --prefix=$PREFIX_PATH package_name

trong đó $PREFIX_PATHtiền tố cài đặt nơi lib, bin và các thư mục cấp cao nhất khác được đặt.


10
pip install packageName -t pathOfDirectory

hoặc là

pip install packageName --target pathOfDirectorty

4

Để thêm vào lời khuyên tốt, vì tôi gặp vấn đề khi cài đặt IPython khi tôi không có quyền ghi /usr/local.

Pip sử dụng distutils để thực hiện cài đặt của nó và chủ đề này thảo luận về cách điều đó có thể gây ra vấn đề vì nó phụ thuộc vào sys.prefixcài đặt.

Vấn đề của tôi đã xảy ra khi cài đặt IPython cố gắng ghi vào '/ usr / local / share / man / man1' với Quyền bị từ chối . Khi cài đặt thất bại, nó dường như không ghi các tệp IPython trong thư mục bin.

Sử dụng "--user" đã hoạt động và các tệp được ghi vào ~ / .local. Thêm ~ / .local / bin vào $ PATH có nghĩa là tôi có thể sử dụng "ipython" từ đó.

Tuy nhiên, tôi đang cố gắng cài đặt cái này cho một số người dùng và đã được cấp quyền ghi vào /usr/local/lib/python2.7thư mục. Tôi đã tạo một thư mục "bin" bên dưới và đặt các chỉ thị cho distutils:

vim ~/.pydistutils.cfg

[install]
install-data=/usr/local/lib/python2.7
install-scripts=/usr/local/lib/python2.7/bin

sau đó ( -Iđược sử dụng để buộc cài đặt mặc dù đã thất bại trước đó / .local install):

pip install -I ipython

Sau đó tôi thêm /usr/local/lib/python2.7/binvào $PATH.

Tôi nghĩ tôi sẽ bao gồm điều này trong trường hợp bất kỳ ai khác có vấn đề tương tự trên máy mà họ không có quyền truy cập sudo.


2

Nếu bạn đang sử dụng brew với python, thật không may, các tàu pip / pip3 với các tùy chọn rất hạn chế. Bạn không có tùy chọn --install-tùy chọn, --target, --user như đã đề cập ở trên.

Lưu ý khi cài đặt pip --user
Trình cài đặt pip bình thường --user bị vô hiệu hóa đối với Python được ủ. Điều này là do lỗi trong distutils, vì Homebrew viết distutils.cfg, đặt tiền tố gói. Một cách giải quyết khác có thể (đặt các tập lệnh thực thi trong ~ / Library / Python /./ bin) là: python -m pip install --user --install-option="--prefix=" <package-name>

Bạn có thể thấy dòng này rất cồng kềnh. Tôi đề nghị sử dụng pyenv để quản lý. Nếu bạn đang sử dụng

brew upgrade python python3

Trớ trêu thay bạn đang thực sự hạ cấp chức năng pip.

(Tôi đăng câu trả lời này, đơn giản vì pip trong mac osx của tôi không có tùy chọn --target và tôi đã dành hàng giờ để sửa nó)


Câu trả lời này với tiền tố rõ ràng và ignore-installeddo những nỗ lực trước đó, đã làm việc cho tôi:python -m pip install --user --install-option="--prefix='/myFunkyApp/lib'" --ignore-installed <package-name>
Jeremy Jones

0

Với pip v1.5.6trên Python v2.7.3(GNU / Linux), tùy chọn --rootcho phép chỉ định tiền tố cài đặt toàn cầu, (dường như) bất kể các tùy chọn của gói cụ thể. Hãy thử

$ pip install --root=/alternative/prefix/path package_name

0

Tôi đề nghị làm theo tài liệu và tạo tập tin ~ / .pip / pip.conf. Lưu ý trong tài liệu thiếu thư mục tiêu đề được chỉ định, dẫn đến lỗi sau:

error: install-base or install-platbase supplied, but installation scheme is incomplete

Nội dung làm việc đầy đủ của tập tin conf là:

[install]
install-base=$HOME
install-purelib=python/lib
install-platlib=python/lib.$PLAT
install-scripts=python/scripts
install-headers=python/include
install-data=python/data

Không may tôi có thể cài đặt, nhưng khi thử gỡ cài đặt pip cho tôi biết không có gói nào như vậy cho quá trình gỡ cài đặt .... vì vậy có gì đó vẫn sai nhưng gói đi đến vị trí được xác định trước.


0

pip install /path/to/package/

bây giờ có thể

Sự khác biệt với điều này và sử dụng cờ -ehoặc --editable-eliên kết đến nơi gói được lưu (tức là thư mục tải xuống của bạn), thay vì cài đặt nó vào đường dẫn python của bạn.

Điều này có nghĩa là nếu bạn xóa / di chuyển gói sang thư mục khác, bạn sẽ không thể sử dụng nó.


điều này không trả lời câu hỏi
Clintm

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.