รวม --user กับ --prefix error ด้วยการติดตั้ง setup.py


102

ฉันกำลังพยายามติดตั้งแพ็คเกจ Python ซึ่งเป็นระบบที่ฉันเพิ่งเข้าถึงได้ ผมพยายามที่จะใช้ประโยชน์จากงูใหญ่ค่อนข้างใหม่ต่อผู้ใช้ไดเรกทอรีเว็บไซต์แพคเกจ--userและตัวเลือกใหม่ ( ขณะนี้ตัวเลือกยังไม่มีเอกสารอย่างไรก็ตามมีอยู่สำหรับ Python 2.6+ คุณสามารถดูวิธีใช้โดยการเรียกใช้python setup.py install --help)

เมื่อได้ลองวิ่ง

python setup.py install --user

บนแพ็คเกจใด ๆ ที่ฉันดาวน์โหลดฉันมักจะได้รับข้อผิดพลาดต่อไปนี้:

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

ข้อผิดพลาดถูกมากงงเพราะในขณะที่คุณสามารถดูผมไม่ได้ให้--prefix, --exec-prefix, --install-baseหรือ--install-platbaseธงเลือกบรรทัดคำสั่ง ฉันเสียเวลาไปมากในการพยายามคิดว่าปัญหาคืออะไร ฉันเอกสารคำตอบของฉันด้านล่างในความหวังที่จะสำรองบางจิตวิญญาณที่ไม่ดีอื่น ๆ ไม่กี่ชั่วโมงของจามรีโกนหนวด


2
ผมได้รับข้อผิดพลาดเดียวกันพยายามติดตั้งหลาม 3.6 จากแหล่งที่มี./configure --prefix=${HOME}ในขณะที่มี "ผู้ใช้ = 1" ~/.pydistutils.cfgใน ในกรณีนี้ฉันต้องแสดงความคิดเห็นชั่วคราว "user = 1" เพื่อให้กระบวนการติดตั้งเสร็จสมบูรณ์
bli

bli ให้คำแนะนำที่ดี ฉันสงสัยว่าตัวเลือก --user มาจากไหนแม้ว่าฉันจะไม่ได้ใช้ตัวเลือกนั้นก็ตาม ติดตั้ง pip --prefix / home / myhomedir ฉันไม่มีไฟล์ ~ / .pydistutils.cfg แต่ยังคงมองหาที่ตั้งค่าตัวเลือก --user
Kemin Zhou

หาสาเหตุของปัญหา นี่เป็นเฉพาะ Debian หลังจากเพิ่ม - ระบบตัวเลือกเพื่อ pip ปัญหาก็หายไป
Kemin Zhou

คำตอบ:


160

วิธีแก้ปัญหาเพียงครั้งเดียว:

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

หรือ

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

โปรดทราบว่าไม่มีข้อความ (ไม่เว้นแม้แต่ช่องว่าง) หลังไฟล์=.

อย่าได้ลืม--userธง

การติดตั้งหลายแพ็คเกจ:

สร้าง~/.pydistutils.cfg(หรือเทียบเท่าสำหรับ OS / แพลตฟอร์มของคุณ) ด้วยเนื้อหาต่อไปนี้:

[install]
prefix=

โปรดทราบว่าไม่มีข้อความ (ไม่เว้นแม้แต่ช่องว่าง) หลังไฟล์=.

จากนั้นเรียกใช้สิ่งที่จำเป็นpip install --userหรือpython setup.py install --userคำสั่ง อย่าได้ลืม--userธง

สุดท้ายลบหรือเปลี่ยนชื่อไฟล์นี้ ออกจากไฟล์ในปัจจุบันนี้จะก่อให้เกิดปัญหาเมื่อติดตั้งแพคเกจหลามทั้งระบบ (เช่นโดยไม่ต้อง--user) ~/.pydistutils.cfgในฐานะผู้ใช้นี้กับเรื่องนี้

สาเหตุของปัญหานี้

สิ่งนี้ดูเหมือนจะเป็นปัญหากับทั้ง OpenSUSE และ RedHat ซึ่งนำไปสู่ข้อบกพร่องใน Virtualenvบนแพลตฟอร์มเหล่านี้

ข้อผิดพลาดเกิดจากไฟล์คอนฟิกูเรชัน distutilsระดับระบบ(ในกรณีของฉัน/usr/lib64/python2.6/distutils/distutils.cfg) ซึ่งมีสิ่งนี้

[install]
prefix=/usr/local

โดยทั่วไปสิ่งนี้เทียบเท่ากับการรันคำสั่ง install เป็นinstall --prefix=/usr/local. คุณต้องลบล้างข้อกำหนดนี้โดยใช้หนึ่งในเทคนิคข้างต้น


1
ขอบคุณมาก. คำนำหน้าว่างช่วยแก้ปัญหาของฉัน: pip 1.1 openSuSE 11.4
guettli

6
คุณยังสามารถส่ง --prefix = ไปยัง setup.py ที่ว่างเปล่าในบรรทัดคำสั่งเพื่อแทนที่ค่าใน distutils.cfg ทั้งระบบ
Tuxdude

2
ว้าว! สิ่งนี้ได้ผลสำหรับฉันด้วย ฉันได้รับข้อผิดพลาดเดียวกันเมื่อพยายามติดตั้ง Powerline powerline.readthedocs.org/en/latest/installation/…
A-Dubb

4
ในความคิดที่สองการทำเช่นนี้จะทำให้เกิดปัญหาที่สำคัญ อย่าเก็บไฟล์นี้ไว้ พบแพทย์ผู้ผลิตเบียร์สำหรับข้อมูลเพิ่มเติม (สมมติว่าคุณใช้ homebrew บน Mac OS X)
A-Dubb

1
โปรดทราบว่าการเก็บไฟล์นี้ไว้เช่นนี้จะทำให้ Python คิดว่า / เป็นไดเร็กทอรีไลบรารี root python ของคุณซึ่งนำไปสู่ปัญหาที่สับสนหากคุณพยายามติดตั้งแพ็คเกจใหม่อื่น ๆ
rogueleaderr

6

ตามที่ระบุไว้ในความคิดเห็นคำตอบที่ยอมรับ (โดย @gotgenes ซึ่งสันนิษฐานว่ามียีน) อาจนำไปสู่ผลลัพธ์ที่ไม่คาดคิด

@rogeleaderr กล่าวว่า "โปรดทราบว่าการเก็บไฟล์ไว้เช่นนี้จะทำให้ Python คิดว่า / เป็นไดเร็กทอรีไลบรารี root python ของคุณซึ่งนำไปสู่ปัญหาที่สับสนหากคุณพยายามติดตั้งแพ็คเกจใหม่อื่น ๆ "

แทนที่จะเขียนไฟล์กำหนดค่าใหม่ตามที่ @gotgenes แนะนำตัวเลือกที่ดีกว่าคือการเพิ่ม--prefix= (โดยไม่มีข้อความทางด้านขวาของเครื่องหมายเท่ากับ) เป็นตัวเลือกบนบรรทัดคำสั่งเช่นเดียวกับใน

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

5

โพสต์เพื่อช่วยเวลาคนอื่นเพราะไม่มีคำตอบที่ใช้ได้สำหรับฉัน

ในบางสภาพแวดล้อมการใช้สวิตช์--target( -t) จะยังคงได้รับข้อผิดพลาดเดียวกัน ในการทดสอบ linux สองรสชาติของฉันฉันพบปัญหาเดียวกันเมื่อใช้--prefix=พารามิเตอร์

รหัส:

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

คำอธิบาย: วิธีแก้ปัญหาของฉันซึ่งดูเหมือนว่าจะใช้ได้กับหลายสภาพแวดล้อม (MacOS, Amazon Linux, Debian) คือการตั้งค่าPYTHONUSERBASEตัวแปรสภาพแวดล้อมเป็นตำแหน่งชั่วคราว --force-reinstallใช้เพื่อทริกเกอร์การติดตั้งภายในเครื่องแม้ว่าจะติดตั้งแพคเกจแล้วก็ตาม

สิ่งนี้จะส่งผลให้โมดูลถูกคอมไพล์ / ติดตั้ง (ขึ้นอยู่กับเวอร์ชัน OS และ Python) เพื่อ: /tmp/lib/python2.7/site-packages/*


0

คุณสามารถเรียกใช้pip install --user .โดยไม่จำเป็นต้องมีอาร์กิวเมนต์คำนำหน้า

สิ่งนี้ดีกว่าอยู่แล้วเพราะจะเป็นค่าเริ่มต้นเป็น python3 หาก pip ของคุณได้รับการกำหนดค่าให้ใช้ Python 3 (ฉันลืมใส่python3 setup.pyและติดตั้งแพ็คเกจ 3 อย่างเดียวภายใต้ 2.7)

(เครดิตhttps://stackoverflow.com/a/1550235/4364036 )


0

ฉันมีปัญหาเดียวกัน มันซ่อนอยู่ภายใน~/.config/pip/pip.confด้วย:

[global]
target=/foo/bar

การกำหนดค่าดังกล่าวสร้างขึ้นโดยสคริปต์ของบุคคลที่สามโดยที่ฉันไม่รู้

ฉันขอแนะนำให้ตรวจสอบไฟล์การกำหนดค่า pip และลบtarget=/foo/barตัวเลือก

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.