DistutilsOptionError: ต้องระบุ home หรือ prefix / exec-prefix - ไม่ใช่ทั้งสองอย่าง


144

ฉันมักจะได้รับการติดตั้งแพ็กเกจหลามผ่าน pip

สำหรับ Google App Engine ฉันต้องติดตั้งแพ็คเกจไปยังไดเรกทอรีเป้าหมายอื่น

ฉันพยายามแล้ว:

pip ติดตั้ง -I flask-restful --target ./lib

แต่มันล้มเหลวด้วย:

ต้องจัดหาทั้งที่บ้านหรือคำนำหน้า / exec-prefix - ไม่ใช่ทั้งสองอย่าง

ฉันจะทำให้เรื่องนี้ทำงานได้อย่างไร

คำตอบ:


289

คุณใช้ OS X และ Homebrew หรือไม่ หน้า Homebrew python https://github.com/Homebrew/brew/blob/master/docs/Homebrew-and-Python.mdเรียกปัญหาที่ทราบด้วย pip และการแก้ไข

ทำงานให้ฉัน

คุณสามารถทำให้ "คำนำหน้าว่าง" นี้เป็นค่าเริ่มต้นโดยการเพิ่มไฟล์ ~ / .pydistutils.cfg ด้วยเนื้อหาต่อไปนี้:

[install]
prefix=

แก้ไข:อย่าใช้ Homebrew นี้ตัวเลือกที่แนะนำก็จะแบ่งการดำเนินงาน pip ปกติ


5
สิ่งที่ดีลิงค์ไม่ดีนี่คือใหม่ที่ฉันคาดหวัง: github.com/Homebrew/homebrew/blob/master/share/doc/homebrew/
......

6
โปรดทราบว่าไฟล์นั้นทำลายสภาพแวดล้อมเสมือนจริงสำหรับฉัน
Dmytro Sadovnychyi

16
คำนำหน้าธุรกิจที่ว่างเปล่านี้หยุดpip installการทำงานปกติ:(
Jaap

10
มีใครคิดวิธีการอนุญาต--targetในขณะที่ไม่ทำลายpip installพฤติกรรมเริ่มต้น?
ryantuck

3
ดูเหมือนจะไม่ถูกต้องอีกต่อไป ลิงก์ใช้งานไม่ได้และลิงก์ที่อัปเดตไม่ได้พูดถึง pydistutils.cfg
Lucretiel

164

ฉันเชื่อว่ามีวิธีแก้ปัญหาที่ง่ายกว่านี้ (Python ของ Homebrew บน macOS) ที่จะไม่ทำให้การทำงานของ pip ปกติของคุณพัง

สิ่งที่คุณต้องทำคือการสร้างsetup.cfgไฟล์ที่ไดเรกทอรีรากของโครงการของคุณซึ่งโดยปกติจะ__init__.pyเป็นไฟล์หลักของไฟล์ py หรือไฟล์ที่รันได้ ดังนั้นหากโฟลเดอร์รูทของโปรเจคของคุณคือ: /path/to/my/project/สร้างsetup.cfgไฟล์ในนั้นและวางคำวิเศษไว้ข้างใน:

[install]
prefix=  

ตกลงตอนนี้คุณสามารถเรียกใช้คำสั่งของ pip สำหรับโฟลเดอร์นั้นได้:

pip install package -t /path/to/my/project/  

คำสั่งนี้จะทำงานอย่างสง่างามสำหรับโฟลเดอร์นั้นเท่านั้น เพียงคัดลอกsetup.cfgไปที่โครงการอื่น ๆ ที่คุณอาจมี ไม่จำเป็นต้องเขียนลง.pydistutils.cfgในโฮมไดเร็กตอรี่ของคุณ

หลังจากติดตั้งโมดูลเสร็จแล้วคุณสามารถลบ setup.cfgได้


2
สิ่งนี้ทำงานได้อย่างสมบูรณ์แบบด้วย pip3.6 เช่นกัน และ pip ​​ของฉันยังคงเหมือนเดิม
Hannibal

10
นี่ควรเป็นคำตอบที่ยอมรับได้ หลีกเลี่ยงการก่อให้เกิดปัญหากับการตั้งค่า pip ทั่วโลก
TrinitronX

10
เน้นการถอดsetup.cfgหลังจากการติดตั้งส่วนหนึ่ง ฉันเผาถึง 2 วันทั้งพยายามที่จะคิดออกว่าทำไมสภาพแวดล้อม virtualenv Could not install packages due to an EnvironmentError: [Errno 1] Operation not permitted: '/bin/easy_install'ของฉันถูกเมามีข้อผิดพลาดเช่น การลบไฟล์ติดตั้งคืนสติของฉัน
kip2

1
@ kip2 ใช่คุณพูดถูกดังนั้นฉันได้แก้ไขคำตอบเพื่อเน้นบิตนั้น AndreG โปรดทราบ
bool.dev

ขอบคุณที่สังเกต มันจะถูกต้องมากขึ้นไหมถ้าฉันพูดว่า "หลังจากคุณติดตั้งโมดูลเสร็จแล้วคุณควรลบ setup.cfg" หรือไม่?
AndreG

25

บน OSX (mac) สมมติว่าโฟลเดอร์โปรเจ็กต์ชื่อ / var / myproject

  1. cd /var/myproject
  2. สร้างไฟล์ชื่อsetup.cfgและเพิ่ม [install] prefix=
  3. วิ่ง pip install <packagename> -t .

1
ฉันไม่แน่ใจว่าสิ่งนี้แตกต่างจากคำตอบ @AndreG อย่างไร
Alastair McCormack

ข้อแตกต่างสำหรับฉันคือ cd ของโซลูชันนี้ลงในไดเร็กตอรี่และทำ-t .แทนที่จะอยู่นอกไดเร็กตอรี่. วิธีนี้ใช้ได้ผลสำหรับฉันและอีกวิธีไม่ได้แม้ว่าฉันจะไม่รู้ว่าทำไม
Chuck Wilbur

12

อีก * แก้ปัญหาสำหรับผู้ใช้ Homebrew virtualenvเป็นเพียงการใช้งาน

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


* ฉันพูดวิธีแก้ปัญหา; บางทีมันอาจเป็นเพียงแรงจูงใจในการใช้ venvs อย่างพิถีพิถัน ...


3
ไม่อยากเชื่อเลยว่านี่เป็นเพียงหนึ่งเดือนที่ผ่านมา เพิ่งจับตัวเองตอบคำถามของตัวเอง; ก่อนเวลา ...
OJFord

ดังนั้นฉันเพิ่งมีปัญหาในคำถามของ OP และเพียงสร้าง virtualenv แก้ปัญหาให้ฉัน ฉันยังคงสามารถติดตั้งลงในไดเรกทอรีเป้าหมายได้ ปัญหาของฉันยังซับซ้อนเนื่องจากฉันติดตั้ง python3 เช่นกัน แต่ +1 สำหรับโซลูชั่น virtualenv
Josh Brown

3

ผมตีข้อผิดพลาดกับข้อเสนอแนะอื่น --install-option="--prefix=lib"ๆ สิ่งเดียวที่ฉันพบว่าการทำงานคือการใช้PYTHONUSERBASEตามที่อธิบายไว้ที่นี่

export PYTHONUSERBASE=lib
pip install -I flask-restful --user

นี่ไม่เหมือนกัน--targetทุกประการ แต่มันหลอกลวงสำหรับฉันในทุกกรณี


2

ดังที่ได้กล่าวมานี้เป็นที่รู้จักข้อผิดพลาดกับ pip & python ติดตั้งกับ homebrew

หากคุณสร้าง~/.pydistutils.cfgไฟล์ด้วยคำสั่ง "empty prefix" มันจะแก้ไขปัญหานี้ได้ แต่มันจะทำให้การทำงานของ pip ผิดปกติ

จนกว่าข้อผิดพลาดนี้จะได้รับการแก้ไขอย่างเป็นทางการหนึ่งในตัวเลือกจะสร้างสคริปต์ทุบตีของคุณเองที่จะจัดการกับกรณีนี้:

 #!/bin/bash

 name=''
 target=''

 while getopts 'n:t:' flag; do
     case "${flag}" in
         n) name="${OPTARG}" ;;
         t) target="${OPTARG}" ;;
     esac
 done

 if [ -z "$target" ];
 then
     echo "Target parameter must be provided"
     exit 1
 fi

 if [ -z "$name" ];
 then
     echo "Name parameter must be provided"
     exit 1
 fi

 # current workaround for homebrew bug
 file=$HOME'/.pydistutils.cfg'
 touch $file

 /bin/cat <<EOM >$file
 [install]
 prefix=
 EOM
 # end of current workaround for homebrew bug

 pip install -I $name --target $target

 # current workaround for homebrew bug
 rm -rf $file
 # end of current workaround for homebrew bug

สคริปต์นี้ล้อมคำสั่งของคุณและ:

  1. ยอมรับพารามิเตอร์ชื่อและเป้าหมาย
  2. ตรวจสอบว่าพารามิเตอร์เหล่านั้นว่างเปล่า
  3. สร้าง~/.pydistutils.cfgไฟล์ด้วยคำสั่ง "empty prefix" ในนั้น
  4. ดำเนินการคำสั่ง pip ของคุณด้วยพารามิเตอร์ที่ให้ไว้
  5. ลบ~/.pydistutils.cfgไฟล์

สคริปต์นี้สามารถเปลี่ยนแปลงและปรับให้เข้ากับความต้องการของคุณ แต่คุณจะได้รับแนวคิด และช่วยให้คุณสามารถเรียกใช้คำสั่งของคุณโดยไม่ต้องเบรก pip หวังว่าจะช่วย :)


2

หากคุณกำลังใช้ virtualenv * which pipคุณควรตรวจสอบอีกครั้งว่าคุณกำลังใช้งานอยู่

หากคุณเห็นอะไรบางอย่างที่เหมือนกับว่า/usr/local/bin/pipคุณเสียสภาพแวดล้อม การเปิดใช้งาน virtualenv ของคุณอีกครั้งจะแก้ไขปัญหานี้:

virtualenv: $ source bin/activate

VirtualFish: $ vf activate [environ]

*: ฉันใช้ virtualfish แต่ฉันคิดว่าเคล็ดลับนี้เกี่ยวข้องกับทั้งคู่


ใช้ virtualenv เป็นจริงวิธีแก้ปัญหาในกรณีที่คล้ายกันของฉัน :)
chriscatfr

-1

ฉันมีปัญหาที่คล้ายกัน ฉันใช้แฟล็ก --systemเพื่อหลีกเลี่ยงข้อผิดพลาดขณะที่ฉัน decribe ที่นี่ในหัวข้ออื่น ๆ ที่ฉันอธิบายกรณีเฉพาะของสถานการณ์ของฉัน ฉันโพสต์ที่นี่โดยคาดหวังว่าจะสามารถช่วยให้ทุกคนประสบปัญหาเดียวกัน

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