วัตถุประสงค์ของ“ pip install --user …” คืออะไร?


189

จากpip install --help:

 --user      Install to the Python user install directory for your platform. Typically ~/.local/, or %APPDATA%\Python on
             Windows. (See the Python documentation for site.USER_BASE for full details.)

เอกสารสำหรับเว็บไซต์ USER_BASE เป็นหนอนที่น่ากลัวที่น่าสนใจ * ห้ามเรื่องที่ฉันไม่เข้าใจ

--userภาษาอังกฤษธรรมดามีจุดประสงค์อะไร? ทำไมการรวมแพคเกจถึง~/.local/สำคัญ? ทำไมไม่เพียงเอาไฟล์ปฏิบัติการมาไว้ที่ $ PATH ของฉันล่ะ


2
คุณสามารถimport site; print site.USER_SITEพิมพ์ตำแหน่งการติดตั้ง /${HOME}/.local/lib/python${PY_MAJOR}.${PY_MINOR}/site-packagesสำหรับผมผมได้
เทรเวอร์บอยด์สมิ ธ

1
บนเครื่องโฮสต์/usr/local/lib/pythonX.X/dist-packagesไดเรกทอรีเริ่มต้นสำหรับแพคเกจติดตั้งโดยpip แต่ถ้าผู้ใช้รายหนึ่งต้องการติดตั้งแพ็คเกจเฉพาะผู้ใช้สามารถใช้งาน$ sudo pip3 --user install some_packageได้ แพ็คเกจนั้นจะยังไม่พร้อมใช้งานสำหรับกลุ่มและอื่น ๆ ที่เข้าถึงโฮสต์นั้น
noobninja

คำตอบ:


223

pip เป็นค่าเริ่มต้นในการติดตั้งแพ็กเกจ Python ไปยังไดเรกทอรีของระบบ (เช่น/usr/local/lib/python3.4) ต้องใช้การเข้าถึงรูท

--user สร้างแพ็คเกจการติดตั้ง pip ในโฮมไดเร็กตอรี่ของคุณแทน, ซึ่งไม่ต้องการสิทธิพิเศษใด ๆ


1
ขอบคุณ; ที่เหมาะสม แต่มีจุดประสงค์--userเพื่อให้แน่ใจว่าไม่ได้เรียกใช้แพคเกจเป็น root หรือไม่? (ฉันจินตนาการสิ่งที่คล้ายกับเช่น Wireshark / Kismet / burpsuite ตัวเลือกการตั้งค่านโยบายกลุ่มเข้าถึงจึงไม่อนุญาตให้ทุกโปรแกรมมีการทำงานเป็นราก. คือในการติดตามขวา?) หรือเป็น--userตัวเลือกเพียงหมาย การอนุญาตให้ติดตั้งโดยไม่มีสิทธิ์รูท หากเป็นกรณีที่ว่าทำไมฉันจึงไม่เคยใช้sudo pip install foo_package? ฉันไม่เคยต้องการรูต privelages เพื่อติดตั้งผ่าน pip ก่อน
Rob Truxal

12
@ Rob Truxal ฉันคิดว่าประเด็นก็คือผู้ใช้รายอื่นจะไม่เห็นแพ็คเกจนี้ บางทีคุณอาจต้องการแพ็คเกจที่เก่ากว่า / ใหม่กว่า แต่ถ้าคุณติดตั้งในระบบคุณจะทำให้เพื่อนร่วมงานของคุณยุ่งเหยิง
ประสบการณ์ใกล้ตาย

4
โอ้! --userพระรามเป็นเรื่องเกี่ยวกับการใช้งานแยก! นั่นทำให้รู้สึกเหมือนเป็นสัญลักษณ์ของความรู้สึกที่เร่าร้อน ขอบคุณ @NDEthos!
Rob Truxal

ตกลงที่นี่เป็นคำถาม (noobish): สมมติว่าฉันเข้าสู่ระบบในฐานะผู้ใช้ foo จากนั้นฉันรันคำสั่ง pip นี้ติดตั้ง --user -r requirements.txt .. และทุกอย่างติดตั้งได้ดี จากนั้นฉันเข้าสู่ระบบในฐานะแถบผู้ใช้และรันโปรแกรมไพ ธ อนเช่นนั้น: sudo -u foo ./odoo-bin .. มันจะอ่านจากแพ็กเกจหลามที่ติดตั้งไว้สำหรับผู้ใช้ foo หรือไม่? หรือว่ามันทำงานอย่างไร
abbood

1
นอกจากนี้ยังมีวิธีการแสดงรายการเฉพาะแพคเกจที่ติดตั้งสำหรับผู้ใช้ปัจจุบันหรือไม่? คือสิ่งที่ต้องการpip freeze --user?
abbood

24

--usersite.USER_SITEการติดตั้งใน

/Users/.../Library/Python/2.7/binสำหรับกรณีของฉันก็คือ ดังนั้นฉันได้เพิ่มที่ PATH ของฉัน (ใน~/.bash_profileไฟล์):

export PATH=$PATH:/Users/.../Library/Python/2.7/bin

15

คำตอบอื่น ๆ ที่กล่าวถึงsite.USER_SITEแพคเกจของ Python {site.USER_BASE}/binหากคุณกำลังมองหาไบนารีเหล่านี้ไปใน

หากคุณต้องการเพิ่มไดเรกทอรีนี้ลงในพา ธ การค้นหาของเชลล์ให้ใช้:

export PATH="${PATH}:$(python3 -c 'import site; print(site.USER_BASE)')/bin"

14

เพียงแค่คำเตือน:

ตามปัญหานี้ , --userขณะนี้ไม่ถูกต้องภายใน env เสมือนpipเนื่องจากตำแหน่งของผู้ใช้ไม่ได้ทำให้รู้สึกจริงๆสำหรับสภาพแวดล้อมเสมือนจริง

ดังนั้นอย่าใช้pip install --user some_pkg ภายในสภาพแวดล้อมเสมือนมิฉะนั้นสภาพแวดล้อมเสมือนpipจะสับสน ดูคำตอบนี้สำหรับรายละเอียดเพิ่มเติม


11

วิธีที่ดีที่สุดในการติดตั้งvirtualenvและไม่ต้องการ--userความสับสน คุณจะได้รับความยืดหยุ่นมากขึ้นและไม่ต้องกังวลกับการอุดตันเวอร์ชั่นงูหลามและโครงการต่าง ๆ ทุกครั้งที่คุณติดตั้งแพ็คเกจ

https://virtualenv.pypa.io/en/stable/


8

บน macOS เหตุผลในการใช้--userแฟล็กคือเพื่อให้แน่ใจว่าเราจะไม่ทำลายไลบรารีที่ระบบปฏิบัติการใช้ อนุรักษ์นิยมวิธีการสำหรับผู้ใช้ MacOS sudoจำนวนมากคือการหลีกเลี่ยงการติดตั้งหรือปรับปรุงจุดที่มีคำสั่งที่ต้องใช้ ดังนั้นจึงรวมถึงการติดตั้ง/usr/local/bin...

Ref: การติดตั้งไพ ธ อนสำหรับ Neovim ( https://github.com/zchee/deoplete-jedi/wiki/Setting-up-Python-for-Neovim )

ฉันไม่ได้ทั้งหมดที่ชัดเจนว่าทำไมติดตั้งเข้า/usr/local/binเป็นความเสี่ยงใน Mac ให้ข้อเท็จจริงที่ว่าระบบเท่านั้นอาศัยไบนารีหลามในและ/Library/Frameworks/ /usr/binฉันสงสัยว่าเป็นเพราะดังที่ได้กล่าวไว้ข้างต้นการติดตั้งลงในสิ่งที่/usr/local/binต้องการsudoซึ่งเป็นการเปิดประตูสู่การทำผิดพลาดกับไลบรารีระบบ ดังนั้นการติดตั้ง~/.local/binเป็นวิธีที่แน่นอนในการหลีกเลี่ยงความเสี่ยงนี้

Ref: การใช้ python บน Mac ( https://docs.python.org/2/using/mac.html )

ในที่สุดในระดับที่มีประโยชน์ในการติดตั้งแพคเกจเป็น/usr/local/binฉันสงสัยว่ามันทำให้รู้สึกถึงการเปลี่ยนเจ้าของไดเรกทอรีจากrootไปuserหรือไม่ สิ่งนี้จะหลีกเลี่ยงการใช้sudoในขณะที่ยังคงป้องกันการเปลี่ยนแปลงตามระบบ * นี่เป็นค่าเริ่มต้นด้านความปลอดภัยหรือไม่ซึ่งเป็นสิ่งที่ระบบ Unix ใช้บ่อยขึ้นในอดีต (ในฐานะเซิร์ฟเวอร์) หรือไม่? หรืออย่างน้อยก็เป็นวิธีที่ดีสำหรับผู้ใช้ Mac ที่ไม่ได้โฮสต์เซิร์ฟเวอร์

* หมายเหตุ: ฟีเจอร์ System Integrity Protection (SIP) ของ Mac ยังช่วยปกป้องผู้ใช้จากการเปลี่ยนไลบรารี่ที่ขึ้นกับระบบด้วย

- จ


8

ไม่มีสภาพแวดล้อมเสมือนจริง

pip <command> --user เปลี่ยนขอบเขตของคำสั่ง pip ปัจจุบันให้ทำงานกับตำแหน่งการติดตั้งแพ็กเกจหลามของบัญชีผู้ใช้ปัจจุบันแทนตำแหน่งการติดตั้งแพ็กเกจทั้งระบบซึ่งเป็นค่าเริ่มต้น

สิ่งนี้สำคัญมากสำหรับเครื่องที่มีผู้ใช้หลายคนเท่านั้น สิ่งที่ติดตั้งไปยังตำแหน่งของระบบจะปรากฏแก่ผู้ใช้ทุกคนดังนั้นการติดตั้งไปยังตำแหน่งของผู้ใช้จะทำให้การติดตั้งแพ็กเกจนั้นแยกจากผู้ใช้รายอื่น (พวกเขาจะไม่เห็นมันและจะต้องติดตั้งแยกต่างหากเพื่อใช้งาน) เนื่องจากอาจมีข้อขัดแย้งของรุ่นการติดตั้งแพคเกจที่ต้องขึ้นต่อกันตามแพ็คเกจอื่นอาจทำให้เกิดปัญหาดังนั้นจึงเป็นการดีที่สุดที่จะไม่ส่งแพคเกจทั้งหมดที่ผู้ใช้กำหนดไปยังตำแหน่งติดตั้งระบบ

  • หากเป็นเครื่องที่มีผู้ใช้คนเดียวไม่มีความแตกต่างเล็กน้อยในการติดตั้งไปยัง--userตำแหน่ง มันจะถูกติดตั้งในโฟลเดอร์อื่นที่อาจจะหรืออาจไม่จำเป็นต้องเพิ่มลงในพา ธ ขึ้นอยู่กับแพ็กเกจและวิธีการใช้งาน (แพคเกจจำนวนมากติดตั้งเครื่องมือบรรทัดคำสั่งที่ต้องอยู่ในพา ธ เพื่อเรียกใช้จากเชลล์) .
  • หากเป็นเครื่องที่มีผู้ใช้หลายคนขอ--userแนะนำให้ใช้รูท / sudo หรือต้องการการติดตั้งผู้ดูแลระบบและส่งผลกระทบต่อสภาพแวดล้อม Python ของผู้ใช้ทุกคนยกเว้นในกรณีของแพ็คเกจทั่วไปที่ผู้ดูแลระบบต้องการให้ผู้ใช้ทั้งหมดสามารถใช้งานได้
    • หมายเหตุ: ต่อความคิดเห็นในส่วน Unix / Linux การติดตั้งจะได้รับการชี้ให้เห็นว่าการติดตั้งระบบควรใช้แพคเกจผู้จัดการทั่วไปเช่นมากกว่าaptpip

ด้วยสภาพแวดล้อมเสมือนจริง

  • ดูข้อมูลเพิ่มเติมเกี่ยวกับการติดตั้งแพคเกจกับสภาพแวดล้อมเสมือนในเอกสารประกอบการบรรจุงูหลาม
  • อ่านเกี่ยวกับวิธีการสร้างและใช้สภาพแวดล้อมเสมือนและvenvคำสั่งในเอกสารหลาม VENV

--userตัวเลือกในสภาพแวดล้อมที่ venv / virtualenv ใช้งานจะติดตั้งไปยังตำแหน่งของผู้ใช้หลามท้องถิ่น (เช่นเดียวกับที่ไม่มีสภาพแวดล้อมเสมือนจริง)

แพ็คเกจจะถูกติดตั้งในสภาพแวดล้อมเสมือนจริง แต่ถ้าคุณใช้--userมันจะบังคับให้ติดตั้งนอกสภาพแวดล้อมเสมือนในไดเรกทอรีสคริปต์ของผู้ใช้ python (ใน Windows ปัจจุบันนี้c:\users\<username>\appdata\roaming\python\python37\scriptsใช้กับ Python 3.7)

อย่างไรก็ตามคุณจะไม่สามารถเข้าถึงระบบหรือการติดตั้งของผู้ใช้จากภายในสภาพแวดล้อมเสมือน (แม้ว่าคุณจะใช้--userในขณะที่อยู่ในสภาพแวดล้อมเสมือน)

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


ตำแหน่งของ Python System และ Local User Install Folders

คุณสามารถค้นหาตำแหน่งของโฟลเดอร์การติดตั้งของผู้ใช้สำหรับไพpython -m site --user-baseธ อนได้ ฉันกำลังค้นหาข้อมูลที่ขัดแย้งกันในคำถาม & คำตอบเอกสารและการใช้คำสั่งนี้บนพีซีของฉันตามค่าเริ่มต้น แต่พวกเขาอยู่ภายใต้โฮมไดเร็กตอรี่ของผู้ใช้ ( ~ทางลัดใน * ระวังและc:\users\<username>โดยทั่วไปสำหรับ Windows)


รายละเอียดอื่น ๆ

--userตัวเลือกที่ไม่ได้เป็นที่ถูกต้องสำหรับทุกคำสั่ง ตัวอย่างเช่นpip uninstallจะค้นหาและถอนการติดตั้งแพ็กเกจไม่ว่าจะติดตั้งที่ไหน (ในโฟลเดอร์ผู้ใช้โฟลเดอร์สภาพแวดล้อมเสมือน ฯลฯ ) และ--userตัวเลือกไม่ถูกต้อง

สิ่งที่ติดตั้งด้วยpip install --userจะถูกติดตั้งในตำแหน่งท้องถิ่นที่จะเห็นได้เฉพาะบัญชีผู้ใช้ปัจจุบันและจะไม่ต้องการการเข้าถึงรูท (บน * นิกซ์) หรือการเข้าถึงของผู้ดูแลระบบ (บน Windows)

--userปรับเปลี่ยนตัวเลือกทุก pipคำสั่งที่ยอมรับมันเพื่อดู / ดำเนินการเกี่ยวกับผู้ใช้ติดตั้งโฟลเดอร์ดังนั้นหากคุณใช้pip list --userมันจะเพียงpip install --userแสดงให้คุณเห็นแพคเกจติดตั้งกับ


1
คุณจะพิจารณาการเรียบเรียงส่วนแรกอีกครั้งหรือไม่? นอกเหนือจากสภาพแวดล้อมเสมือน Python เป็นวิธีที่ดีที่สุดในการหลีกเลี่ยงการใช้pip installโดยไม่ต้องใช้--userทั้งหมด สิ่งนี้จะติดตั้งแพ็กเกจ Python ในตำแหน่งที่ควรปล่อยให้ตัวจัดการแพ็คเกจของระบบ (ตัวอย่างเช่นaptใน Debian / Ubuntu) เป็นการดีกว่าที่จะไม่ยุ่งกับสิ่งนี้สิ่งนี้นำไปสู่ปัญหามากมาย ถ้าแพคเกจหลามความต้องการที่จะให้บริการแก่ผู้ใช้ทุกคนแล้วใช้แพคเกจผู้จัดการระบบปฏิบัติการ sudo pip install ...แต่ไม่ได้ทำ sudo pip install --target ...ทางเลือกคือ บน Windows มันมีปัญหาน้อยกว่า
sinoroc

โอเค - คุณหมายถึงครึ่งหลังของสัญลักษณ์หัวข้อสุดท้ายในส่วน 'ไม่มีสภาพแวดล้อมเสมือนจริง' ใช่ไหม ถ้าไม่ชิ้นส่วนเฉพาะใด (อย่าลังเลที่จะแก้ไขโดยตรงสำหรับการอัปเดตนี้ฉันไม่ใช่ผู้ใช้ * เป็นหลัก)
LightCC

ผมเห็นว่าถ้าคุณไม่ได้ใช้ Windows แล้วมันมากน้อยของความกังวลแน่นอนเพราะมันไม่ได้จริงๆมีแพคเกจผู้จัดการศูนย์เว้นแต่คุณจะเริ่มต้นใช้งานบางอย่างเช่นnuget ฉันจะดูว่าฉันมาแก้ไขคำตอบของคุณ
sinoroc

@sinoroc ฉันเพิ่มบันทึกย่อในย่อหน้านั้น อย่าลังเลที่จะอัปเดตให้แม่นยำยิ่งขึ้น ฯลฯ หรือแก้ไขที่อื่นถ้าฉันมีถ้อยคำที่คล้ายกัน
LightCC

1

ทำไมไม่เพียงแค่ใส่ไฟล์ปฏิบัติการไว้ใน $ PATH ของฉัน

~/.local/bin directoryเป็นทฤษฎีที่คาดว่าจะอยู่ในของคุณ$PATH

ตามที่คนเหล่านี้ จะเป็นข้อผิดพลาดที่ไม่ได้เพิ่มในเมื่อใช้$PATHsystemd

คำตอบนี้อธิบายได้อย่างกว้างขวางมากขึ้น

แต่แม้ว่า distro ของคุณรวมถึง~/.local/binไดเรกทอรีไป$PATHมันอาจจะเป็นในรูปแบบดังต่อไปนี้ (ภายใน~/.profile):

if [ -d "$HOME/.local/bin" ] ; then
    PATH="$HOME/.local/bin:$PATH"
fi

ซึ่งจะทำให้คุณต้องออกจากระบบและลงชื่อเข้าใช้อีกครั้งหากไม่มีไดเรกทอรีดังกล่าวมาก่อน

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