Kết hợp --user với --prefix error với setup.py cài đặt


103

Tôi đang cố gắng cài đặt các gói Python một hệ thống mà gần đây tôi đã có quyền truy cập. Tôi đang cố gắng tận dụng thư mục gói trang web tương đối mới của Python cho mỗi người dùng và tùy chọn mới --user. (Tùy chọn hiện không có tài liệu , tuy nhiên nó tồn tại cho Python 2.6+; bạn có thể xem trợ giúp bằng cách chạy python setup.py install --help.)

Khi tôi thử chạy

python setup.py install --user

trên bất kỳ gói nào tôi đã tải xuống, tôi luôn gặp lỗi sau:

error: can't combine user with with prefix/exec_prefix/home or install_(plat)base

Các lỗi đã vô cùng bối rối bởi vì, như bạn thấy, tôi đã không cung cấp --prefix, --exec-prefix, --install-base, hoặc --install-platbasecờ như các tùy chọn dòng lệnh. Tôi đã lãng phí rất nhiều thời gian để cố gắng tìm ra vấn đề là gì. Tôi ghi lại câu trả lời của mình dưới đây, với hy vọng có thể giúp những linh hồn tội nghiệp khác được vài giờ cạo râu yak .


2
Tôi đã gặp lỗi tương tự khi cố gắng cài đặt python 3.6 từ nguồn ./configure --prefix=${HOME}trong khi có "user = 1" ~/.pydistutils.cfg. Trong trường hợp đó, tôi cần bình luận tạm thời "user = 1" để quá trình cài đặt có thể hoàn tất.
Bli

Bli đã đưa ra một gợi ý tốt. Tôi đã tự hỏi tùy chọn --user đến từ đâu ngay cả khi tôi không sử dụng tùy chọn đó. pip cài đặt --prefix / home / myhomedir. Tôi không có tệp ~ / .pydistutils.cfg, tôi vẫn đang tìm nơi đặt tùy chọn --user.
Kemin Zhou

Tìm ra nguồn gốc của vấn đề. Đây là phiên bản dành riêng cho Debian. Sau khi thêm tùy chọn --system để khắc phục sự cố.
Kemin Zhou

Câu trả lời:


161

Giải pháp một lần:

pip install --user --install-option="--prefix=" <package_name>

hoặc là

python setup.py install --user --prefix=

Lưu ý rằng không có văn bản (thậm chí không phải khoảng trắng) sau = .

Đừng không quên--user lá cờ.

Cài đặt nhiều gói:

Tạo ~/.pydistutils.cfg(hoặc tương đương cho hệ điều hành / nền tảng của bạn) với các nội dung sau:

[install]
prefix=

Lưu ý rằng không có văn bản (thậm chí không phải khoảng trắng) sau = .

Sau đó chạy các lệnh cần thiết pip install --userhoặc python setup.py install --user. Đừng không quên--user lá cờ.

Cuối cùng, xóa hoặc đổi tên tệp này. Để tệp này hiển thị sẽ gây ra sự cố khi cài đặt các gói Python trên toàn hệ thống (tức là không có --user) vì người dùng này với~/.pydistutils.cfg .

Nguyên nhân của vấn đề này

Đây dường như là vấn đề với cả OpenSUSE và RedHat, điều này đã dẫn đến lỗi trong virtualenv trên các nền tảng này.

Lỗi bắt nguồn từ tệp cấu hình distutils cấp hệ thống (trong trường hợp của tôi /usr/lib64/python2.6/distutils/distutils.cfg), nơi có điều này

[install]
prefix=/usr/local

Về cơ bản, điều này tương đương với việc luôn chạy lệnh install as install --prefix=/usr/local. Bạn phải ghi đè thông số kỹ thuật này bằng một trong các kỹ thuật ở trên.


1
Cảm ơn rât nhiều. Tiền tố trống đã khắc phục sự cố của tôi: pip 1.1 openSuSE 11.4.
guettli

6
Bạn cũng có thể vượt qua một --prefix = trống để setup.py trong dòng lệnh để ghi đè giá trị trong distutils.cfg toàn hệ thống
Tuxdude

2
Chà! Điều này cũng làm việc cho tôi. Tôi nhận được lỗi tương tự khi cố gắng cài đặt Powerline. powerline.readthedocs.org/en/latest/installation/…
A-Dubb,

4
Suy nghĩ thứ hai, làm điều này sẽ gây ra các vấn đề CHÍNH. KHÔNG giữ tập tin này xung quanh. Gặp bác sĩ bia để biết thêm thông tin (giả sử bạn đang sử dụng homebrew trên Mac OS X).
A-Dubb

1
Lưu ý rằng việc giữ tệp này như vậy sẽ khiến Python nghĩ rằng / là thư mục thư viện python gốc của bạn, dẫn đến các vấn đề khó hiểu nếu bạn cố gắng cài đặt các gói mới khác.
rogueleaderr

6

Như đã được lưu ý trong các bình luận, câu trả lời được chấp nhận (bởi @gotgenes, người, có lẽ là có gen) có thể dẫn đến những hậu quả không mong muốn.

@rogeleaderr nói, "Lưu ý rằng việc giữ tệp này như thế này sẽ khiến Python nghĩ rằng / là thư mục thư viện python gốc của bạn, dẫn đến các vấn đề khó hiểu nếu bạn cố gắng cài đặt các gói mới khác."

Thay vì viết một tệp cấu hình mới, như @gotgenes đề xuất, một tùy chọn tốt hơn là thêm --prefix= (không có văn bản nào ở bên phải của dấu bằng) làm tùy chọn trên dòng lệnh , như trong

$ python setup.py install --user --prefix=

5

Đăng để tiết kiệm thời gian cho người khác, vì không có câu trả lời nào phù hợp với tôi ...

Trong một số môi trường, sử dụng công tắc --target( -t) sẽ vẫn gặp lỗi tương tự. Trong thử nghiệm của tôi trên hai phiên bản linux, tôi gặp phải vấn đề tương tự khi sử dụng--prefix= tham số.

Mã:

PYTHONUSERBASE=/tmp/ pip install --user --force-reinstall $PACKAGE

Giải thích: Cách giải quyết của tôi, dường như hoạt động trên nhiều môi trường (MacOS, Amazon Linux, Debian) là đặt PYTHONUSERBASEbiến môi trường thành một vị trí tạm thời. --force-reinstallđược sử dụng để kích hoạt cài đặt cục bộ ngay cả khi gói đã được cài đặt.

Điều này sẽ dẫn đến việc mô-đun được biên dịch / cài đặt (tùy thuộc vào hệ điều hành và phiên bản Python) thành: /tmp/lib/python2.7/site-packages/*


0

Bạn có thể chạy đơn giản pip install --user ., không cần args tiền tố.

Điều này dù sao cũng tốt hơn vì nó sẽ mặc định là python3 nếu pip của bạn được định cấu hình để sử dụng Python 3. (Tôi quên nhập python3 setup.py và nó đã cài đặt gói 3 chỉ dưới 2.7)

(tín dụng https://stackoverflow.com/a/1550235/4364036 )


0

Tôi đã có cùng một vấn đề. Nó được giấu bên trong ~/.config/pip/pip.confvới:

[global]
target=/foo/bar

Một cấu hình như vậy được tạo bởi một tập lệnh của bên thứ ba mà tôi không biết.

Tôi khuyên bạn nên kiểm tra các tệp cấu hình pip và xóa các target=/foo/bartùy chọn.

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.