Saya mencoba menginstal paket Python, sistem yang baru-baru ini saya akses. Saya mencoba memanfaatkan direktori paket situs per pengguna Python yang relatif baru , dan opsi baru --user
. (Opsi saat ini tidak terdokumentasi , namun ada untuk Python 2.6+; Anda dapat melihat bantuannya dengan menjalankan python setup.py install --help
.)
Saat aku mencoba lari
python setup.py install --user
pada paket apa pun yang saya unduh, saya selalu mendapat kesalahan berikut:
error: can't combine user with with prefix/exec_prefix/home or install_(plat)base
Kesalahan itu sangat membingungkan karena, seperti yang Anda lihat, saya tidak menyediakan --prefix
, --exec-prefix
, --install-base
, atau --install-platbase
bendera sebagai opsi baris perintah. Saya membuang banyak waktu untuk mencari tahu apa masalahnya. Saya mendokumentasikan jawaban saya di bawah, dengan harapan dapat menyelamatkan jiwa malang lain beberapa jam dari mencukur yak .
sumber
./configure --prefix=${HOME}
"user = 1" di~/.pydistutils.cfg
. Dalam hal ini, saya perlu memberi komentar sementara "user = 1" agar proses instalasi dapat selesai.Jawaban:
Solusi satu kali:
atau
Perhatikan bahwa tidak ada teks (bahkan spasi) setelah
=
.Jangan tidak lupa
--user
bendera.Menginstal banyak paket:
Buat
~/.pydistutils.cfg
(atau setara untuk OS / platform Anda) dengan konten berikut:Perhatikan bahwa tidak ada teks (bahkan spasi) setelah
=
.Kemudian jalankan perintah
pip install --user
atau yang diperlukanpython setup.py install --user
. Jangan tidak lupa--user
bendera.Terakhir, hapus atau ganti nama file ini. Membiarkan file ini ada akan menyebabkan masalah saat menginstal paket Python di seluruh sistem (yaitu, tanpa
--user
) karena pengguna ini dengan ini~/.pydistutils.cfg
.Penyebab masalah ini
Ini tampaknya menjadi masalah dengan OpenSUSE dan RedHat, yang menyebabkan bug di virtualenv pada platform ini.
Kesalahan berasal dari file konfigurasi distutils tingkat sistem (dalam kasus saya
/usr/lib64/python2.6/distutils/distutils.cfg
) di mana ada iniPada dasarnya, ini sama dengan selalu menjalankan perintah install sebagai
install --prefix=/usr/local
. Anda harus mengganti spesifikasi ini menggunakan salah satu teknik di atas.sumber
Seperti yang telah dicatat di komentar, jawaban yang diterima (oleh @gotgenes, yang, mungkin, memiliki gen) dapat menyebabkan konsekuensi yang tidak terduga.
@rogeleaderr mengatakan, "Perhatikan bahwa menyimpan file ini seperti ini akan membuat Python berpikir bahwa / adalah direktori pustaka root python Anda, menyebabkan masalah yang membingungkan jika Anda mencoba menginstal paket baru lainnya."
Daripada menulis file konfigurasi baru, seperti yang direkomendasikan @gotgenes, opsi yang lebih baik adalah menambahkan
--prefix=
(tanpa teks di sebelah kanan tanda sama dengan) sebagai opsi pada baris perintah , seperti padasumber
Memposting untuk menghemat waktu orang lain, karena tidak ada jawaban yang berhasil untuk saya ...
Di beberapa lingkungan, menggunakan sakelar
--target
(-t
) masih akan mengalami kesalahan yang sama. Dalam pengujian saya pada dua rasa linux, saya mengalami masalah yang sama saat menggunakan--prefix=
parameter.Kode:
Penjelasan: Solusi saya, yang tampaknya berfungsi di banyak lingkungan (MacOS, Amazon Linux, Debian) adalah menyetel
PYTHONUSERBASE
variabel lingkungan ke lokasi sementara.--force-reinstall
digunakan untuk memicu penginstalan lokal meskipun paket sudah diinstal.Ini akan menghasilkan modul yang dikompilasi / diinstal (tergantung pada OS dan versi Python) ke:
/tmp/lib/python2.7/site-packages/*
sumber
Anda cukup menjalankan
pip install --user .
, tidak perlu argumen awalan.Ini lebih baik karena akan default ke python3 jika pip Anda dikonfigurasi untuk menggunakan Python 3. (Saya lupa masuk
python3 setup.py
dan menginstal paket 3-satunya di bawah 2.7)(kredit https://stackoverflow.com/a/1550235/4364036 )
sumber
Saya memiliki masalah yang sama. Itu tersembunyi di dalam
~/.config/pip/pip.conf
dengan:Konfigurasi semacam itu dibuat oleh skrip pihak ketiga tanpa sepengetahuan saya.
Saya sarankan untuk memeriksa file konfigurasi pip dan menghapus
target=/foo/bar
opsi.sumber