Gabungkan --user dengan --prefix error dengan setup.py install

103

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-platbasebendera 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 .

Gotgenes
sumber
2
Saya mendapat kesalahan yang sama saat mencoba menginstal python 3.6 dari sumber dengan ./configure --prefix=${HOME}"user = 1" di ~/.pydistutils.cfg. Dalam hal ini, saya perlu memberi komentar sementara "user = 1" agar proses instalasi dapat selesai.
bli
bli memberi petunjuk bagus. Saya bertanya-tanya dari mana asal opsi --user bahkan saya tidak menggunakan opsi itu. pip install --prefix / home / myhomedir. Saya tidak memiliki file ~ / .pydistutils.cfg, masih mencari di mana opsi --user disetel.
Kemin Zhou
Cari tahu sumber masalahnya. Ini khusus untuk Debian. Setelah menambahkan opsi --system ke pip, masalahnya hilang.
Kemin Zhou

Jawaban:

161

Solusi satu kali:

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

atau

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

Perhatikan bahwa tidak ada teks (bahkan spasi) setelah =.

Jangan tidak lupa --userbendera.

Menginstal banyak paket:

Buat ~/.pydistutils.cfg(atau setara untuk OS / platform Anda) dengan konten berikut:

[install]
prefix=

Perhatikan bahwa tidak ada teks (bahkan spasi) setelah =.

Kemudian jalankan perintah pip install --useratau yang diperlukan python setup.py install --user. Jangan tidak lupa --userbendera.

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 ini

[install]
prefix=/usr/local

Pada dasarnya, ini sama dengan selalu menjalankan perintah install sebagai install --prefix=/usr/local. Anda harus mengganti spesifikasi ini menggunakan salah satu teknik di atas.

Gotgenes
sumber
1
Terima kasih banyak. Awalan kosong memperbaiki masalah saya: pip 1.1 openSuSE 11.4.
guettli
6
Anda juga bisa meneruskan kosong --prefix = ke setup.py di baris perintah untuk mengganti nilai di distutils.cfg seluruh sistem
Tuxdude
2
Wow! Ini berhasil juga untuk saya. Saya menerima kesalahan yang sama saat mencoba menginstal Powerline. powerline.readthedocs.org/en/latest/installation/…
A-Dubb
4
Dipikir-pikir, melakukan ini akan menyebabkan masalah BESAR. JANGAN menyimpan file ini. Lihat brew doctor untuk info lebih lanjut (dengan asumsi Anda menggunakan homebrew di Mac OS X).
A-Dubb
1
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.
rogueleaderr
6

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 pada

$ python setup.py install --user --prefix=
dbliss
sumber
5

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:

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

Penjelasan: Solusi saya, yang tampaknya berfungsi di banyak lingkungan (MacOS, Amazon Linux, Debian) adalah menyetel PYTHONUSERBASEvariabel lingkungan ke lokasi sementara. --force-reinstalldigunakan 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/*

EE1213
sumber
0

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.pydan menginstal paket 3-satunya di bawah 2.7)

(kredit https://stackoverflow.com/a/1550235/4364036 )

wesinat0r
sumber
0

Saya memiliki masalah yang sama. Itu tersembunyi di dalam ~/.config/pip/pip.confdengan:

[global]
target=/foo/bar

Konfigurasi semacam itu dibuat oleh skrip pihak ketiga tanpa sepengetahuan saya.

Saya sarankan untuk memeriksa file konfigurasi pip dan menghapus target=/foo/baropsi.

sir__finley
sumber