ติดตั้งแพ็คเกจ Python ในไดเรกทอรีอื่นโดยใช้ pip หรือไม่?


435

ฉันรู้ว่าคำตอบที่ชัดเจนคือการใช้ virtualenv และ virtualenvwrapper แต่ด้วยเหตุผลต่าง ๆ ฉันไม่สามารถ / ไม่ต้องการทำเช่นนั้น

ดังนั้นฉันจะแก้ไขคำสั่งได้อย่างไร

pip install package_name

ที่จะทำให้การpipติดตั้งที่ใดที่หนึ่งแพคเกจอื่น ๆ กว่าค่าเริ่มต้นsite-packages?



2
ตอนนี้คำถามข้อที่สอง: เมื่อคุณติดตั้งในไดเรกทอรีที่กำหนดเองแล้ววิธีที่จะทำให้pipไม่พยายามลบและรุ่นเก่ากว่าจากไดเรกทอรีที่ไม่ได้กำหนดเอง ตัวอย่างเช่น - ทั้งระบบซึ่งคุณไม่มีสิทธิ์เขียน จนถึงตอนนี้ฉันเพิ่งถอดมันออกด้วยeasy_install...
Tomasz Gandor

2
@TomaszGandor ฉันคิดว่าการใช้--ignore-installedตัวเลือกควรป้องกันไม่ให้ pip พยายามถอนการติดตั้งแพ็คเกจที่ติดตั้งแล้ว
Piotr Dobrogost

ขออภัยฉันใหม่ด้วย pip แต่คำถามของคุณเหมือนกันกับการถาม "ว่าจะติดตั้ง pi ไปยัง python เวอร์ชันอื่นได้อย่างไร"? ฉันมี python 3.4 และ 3.5 แต่ฉันต้องการติดตั้ง pip เพื่อไปที่ python 3.5
Charlie Parker

@ Charlie Nope คำถามที่แตกต่าง ฉันไม่รู้มากพอเกี่ยวกับการติดตั้ง / ความตั้งใจของคุณ แต่โดยทั่วไปฉันอาจใช้ virtualenvwrapper และสร้างสภาพแวดล้อมเสมือนด้วยบางสิ่งบางอย่างmkvirtualenv --python=/usr/bin/python3.5 env_name
Monika Sulik

คำตอบ:


334

ใช้:

pip install --install-option="--prefix=$PREFIX_PATH" package_name

คุณอาจต้องการใช้--ignore-installedเพื่อบังคับให้ติดตั้งการอ้างอิงทั้งหมดใหม่โดยใช้คำนำหน้าใหม่นี้ คุณสามารถใช้--install-optionหลาย ๆ ครั้งเพื่อเพิ่มตัวเลือกใด ๆ ที่คุณสามารถใช้กับpython setup.py install( --prefixอาจเป็นสิ่งที่คุณต้องการ แต่มีตัวเลือกเพิ่มเติมที่คุณสามารถใช้)


5
ถ้าคุณทำเช่นนี้มีวิธีที่pip freezeจะดูไดเรกทอรีสำรองหรือไม่
Russ

7
pip freeze ดูที่เส้นทางดังนั้นถ้าคุณชอบPYTHONPATH=$PREFIX_PATH/lib/python2.6/site-packages pip freezeมันควรเห็นมัน
Ian Bicking

4
การใช้--prefix=$PREFIX_PATHดูเหมือนจะไม่อนุญาตให้มีการควบคุมไดเรกทอรีการติดตั้งอย่างสมบูรณ์เนื่องจากมีส่วนต่อท้ายเฉพาะของระบบที่ผนวกเข้ากับมัน ( \Lib\site-packagesบน Windows เป็นต้น) มีวิธีระบุไดเรกทอรีเฉพาะหรือไม่?
Piotr Dobrogost

1
@Piotr: ใช่เห็นคำตอบของฉัน การใช้ '--prefix' นั้นค่อนข้างหยาบ แต่ใช้งานได้ดีถ้าคุณต้องการให้ไพ ธ อนของคุณอยู่ภายใต้ /usr/lib/pythonX.Y/site-packages แทน /usr/local/lib/pythonX.Y/site- แพคเกจ
Anthon

80
ไม่ใช่คำตอบที่ไม่ดีเมื่อ 4 ปีที่แล้ว แต่มีตัวเลือก - เป้าหมายอยู่ตอนนี้
Tritium21

545

--targetสวิทช์คือสิ่งที่คุณกำลังมองหา:

pip install --target=d:\somewhere\other\than\the\default package_name

แต่คุณยังต้องเพิ่มd:\somewhere\other\than\the\defaultเพื่อPYTHONPATHใช้งานได้จริงจากที่ตั้งนั้น

-t, - เป้าหมาย <dir>
ติดตั้งแพ็คเกจลงใน <dir> โดยค่าเริ่มต้นสิ่งนี้จะไม่แทนที่ไฟล์ / โฟลเดอร์ที่มีอยู่ใน <dir>
ใช้ - อัปเกรดเพื่อแทนที่แพ็คเกจที่มีอยู่ใน <dir> ด้วยเวอร์ชันใหม่


อัพเกรด pip ถ้าไม่มีสวิตช์เป้าหมาย:

บน Linux หรือ OS X:

pip install -U pip

บน Windows ( สามารถแก้ไขปัญหาได้ ):

python -m pip install -U pip

8
@DanH วิ่งpip install --upgrade pip!
r3m0t

16
นี่คือคำตอบที่แท้จริงมันเป็นเพียงตัวเลือกที่เพิ่มเข้ามาเล็กน้อยหลังจากคำตอบที่ยอมรับ
bukzor

5
--install-option="--prefix=$PREFIX_PATH"@Ian Bicking พูดถึงความแตกต่างระหว่างอะไรและ--target=$PATHตัวเลือก?
Hibou57

6
targetเป็นตัวเลือกที่ pip และทุกอย่างที่คุณใส่ในจะถูกส่งผ่านไปยังinstall-option setup.py install commandโดยทั่วไปtargetจะเป็นสถานที่ตั้งแพคเกจเว็บไซต์ที่กำหนดเอง
Janusz Skonieczny

10
การใช้--targetอาจส่งผลให้เกิดการติดตั้งบางส่วนเนื่องจากจะไม่ติดตั้งใด ๆ รวมถึงสคริปต์ / ไฟล์ข้อมูลในคำนำหน้าที่ระบุ ดูเหมือนว่าการส่งผ่าน--prefixด้วย--install-optionเป็นวิธีเดียวที่เหมาะสมที่จะมีการควบคุมเต็มรูปแบบผ่านการติดตั้งที่ใช้คำนำหน้า
Kenneth Hoste

74

แทนที่จะเป็น--targetตัวเลือกหรือ--install-optionsตัวเลือกฉันได้พบว่าสิ่งต่อไปนี้ใช้ได้ดี (จากการอภิปรายข้อผิดพลาดเกี่ยวกับสิ่งนี้ที่https://github.com/pypa/pip/issues/446 ):

PYTHONUSERBASE=/path/to/install/to pip install --user

(หรือตั้งค่าPYTHONUSERBASEไดเรกทอรีในสภาพแวดล้อมของคุณก่อนเรียกใช้คำสั่งโดยใช้export PYTHONUSERBASE=/path/to/install/to)

นี้ใช้ประโยชน์มาก--userตัวเลือก แต่บอกว่ามันจะทำให้bin, lib, shareและไดเรกทอรีอื่น ๆ ที่คุณคาดหวังภายใต้คำนำหน้ากำหนดเองมากกว่า$HOME/.localที่คุณคาดหวังภายใต้คำนำหน้ากำหนดเองมากกว่า

จากนั้นคุณสามารถเพิ่มนี้เพื่อคุณPATH, PYTHONPATHและตัวแปรอื่น ๆ ตามที่คุณต้องการไดเรกทอรีการติดตั้งปกติ

โปรดทราบว่าคุณอาจจำเป็นต้องระบุ--upgradeและ--ignore-installedตัวเลือกหากแพ็คเกจใด ๆ ที่ขึ้นอยู่กับนี้จำเป็นต้องติดตั้งรุ่นที่ใหม่กว่าในPYTHONUSERBASEไดเรกทอรีเพื่อแทนที่รุ่นที่ระบบให้มา

ตัวอย่างเต็มรูปแบบ:

PYTHONUSERBASE=/opt/mysterypackage-1.0/python-deps pip install --user --upgrade numpy scipy

.. เพื่อติดตั้งscipyและnumpyแพ็คเกจเวอร์ชันล่าสุดลงในไดเรกทอรีซึ่งคุณสามารถรวมไว้ในสิ่งที่คุณPYTHONPATHชอบ (ใช้ bash และ python 2.6 บน CentOS 6 สำหรับตัวอย่างนี้):

export PYTHONPATH=/opt/mysterypackage-1.0/python-deps/lib64/python2.6/site-packages:$PYTHONPATH
export PATH=/opt/mysterypackage-1.0/python-deps/bin:$PATH

การใช้ virtualenv ยังคงเป็นทางออกที่ดีกว่าและดีกว่า!


4
สิ่งนี้ทำงานได้กับ Travis CI ที่ทำงานบนคอนเทนเนอร์ Docker ในขณะที่โซลูชัน --install-option = "- คำนำหน้า = $ PREFIX_PATH" ไม่ได้แก้ปัญหา
32bits

1
คำถาม noobie วิธีการที่สำคัญคือ/binpip โฟลเดอร์สร้าง--userสร้างมันเช่นเดียวกับ--PREFIXในขณะที่--targetไม่ได้
Jonathan

1
หากแพ็คเกจถูกติดตั้งใน Python ทั่วโลก--ignore-installedเป็นสิ่งจำเป็น
George Sovetov

1
ตัวเลือกนี้เข้ากันได้กับ--editableและการติดตั้งในท้องถิ่น
mdh

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

43

การติดตั้งแพ็กเกจ Python มักจะรวมไฟล์ Python บริสุทธิ์บางไฟล์เท่านั้น หากแพ็กเกจมีข้อมูลสคริปต์และหรือสิ่งที่เรียกใช้งานได้สิ่งเหล่านี้จะถูกติดตั้งในไดเรกทอรีต่าง ๆ จากไฟล์ Python แท้

สมมติว่าแพ็กเกจของคุณไม่มี data / สคริปต์ / executables และคุณต้องการให้ไฟล์ Python ของคุณเข้าสู่/python/packages/package_name(และไม่ใช่ไดเรกทอรีย่อยบางระดับด้านล่าง/python/packagesเมื่อใช้--prefix) คุณสามารถใช้คำสั่งครั้งเดียว:

pip install --install-option="--install-purelib=/python/packages" package_name

หากคุณต้องการแพคเกจทั้งหมด (หรือส่วนใหญ่) ไปที่นั่นคุณสามารถแก้ไขสิ่ง~/.pip/pip.confต่อไปนี้:

[install]
install-option=--install-purelib=/python/packages

ด้วยวิธีนี้คุณไม่สามารถลืมได้ว่าจะต้องระบุซ้ำแล้วซ้ำอีก

Excecutables / data / สคริปต์ใด ๆ ที่รวมอยู่ในแพ็คเกจจะยังคงอยู่ในตำแหน่งเริ่มต้นเว้นแต่คุณจะระบุตัวเลือกการติดตั้งเพิ่มเติม ( --prefix/ --install-data/ --install-scriptsฯลฯ เพื่อดูรายละเอียดดูตัวเลือกการติดตั้งแบบกำหนดเอง )


1
ข้อดีอย่างมากสำหรับไฟล์ปรับแต่ง ผมเองระบุ--prefixที่นั่นเพราะฉันมีไดเรกทอรี "ท้องถิ่น" บนเซิร์ฟเวอร์ที่ใช้ร่วมกันในไดเรกทอรีบ้านและมันถูกใช้เป็นคำนำหน้าโดยก่อนที่ผมจะย้ายไปeasy_install pipระบบ$PATHและ$PYTHONPATHถูกปรับแต่งมาก่อน แทนที่จะinstall-option=--install-purelib=/blahมีtarget=/blahตัวเลือกใหม่/ สวิตช์นี้ นอกจากนี้ยังมีความสุข แต่บางครั้งคุณต้องการเพียงแค่การเปลี่ยนสำหรับ--prefixที่คุณต้องการใช้งานร่วมกับหรือsetup.py easy_install
Tomasz Gandor

30

เพื่อ pip ติดตั้งห้องสมุดตรงที่ฉันต้องการฉันไปที่ตำแหน่งที่ฉันต้องการไดเรกทอรีด้วย terminal แล้วใช้

pip install mylibraryName -t . 

ตรรกะที่ฉันนำมาจากหน้านี้: https://cloud.google.com/appengine/docs/python/googlecloudstorageclient/download


11
-tมีการจดชวเลขสำหรับ--target
Jonathan

นี่เป็นทางออกเดียวที่ใช้ได้สำหรับฉัน (Windows 7)
Coliban

18

ดูเหมือนว่าไม่มีใครพูดถึงตัวเลือก -t แต่สิ่งที่ง่ายที่สุด:

pip install -t <direct directory> <package>

8
-tตัวเลือกที่เป็นเวอร์ชั่นสั้นของ--targetตัวเลือกที่ได้รับการอธิบายไว้ในคำตอบอื่น ( stackoverflow.com/a/19404371/594053 ) :)
MattiSG

14

เพียงเพิ่มจุดหนึ่งในคำตอบของ @Ian Bicking:

การใช้--userตัวเลือกในการระบุไดเรกทอรีที่ติดตั้งจะทำงานหากต้องการติดตั้งแพ็กเกจ Python บางตัวลงในโฮมไดเร็กตอรี่ (โดยไม่มีผู้ใช้ sudo ขวา) บนเซิร์ฟเวอร์ระยะไกล

เช่น,

pip install --user python-memcached

คำสั่งจะติดตั้งแพ็กเกจลงในหนึ่งในไดเรกทอรีที่ระบุไว้ใน PYTHONPATH ของคุณ


14

ทดสอบตัวเลือกเหล่านี้ด้วย python3.5 และ pip ​​9.0.3:

pip install - เป้าหมาย / myfolder [แพ็คเกจ]

ติดตั้งแพคเกจทั้งหมดรวมถึงการอ้างอิงภายใต้ / myfolder ไม่คำนึงถึงว่าแพ็คเกจที่ขึ้นต่อกันได้ถูกติดตั้งไว้ที่อื่นใน Python แล้ว คุณจะพบแพ็คเกจจาก / myfolder / [package_name] ในกรณีที่คุณมีเวอร์ชัน Python หลายรุ่นสิ่งนี้ไม่ได้คำนึงถึงสิ่งนั้น (ไม่มีเวอร์ชัน Python ในชื่อโฟลเดอร์แพ็คเกจ)

pip install --prefix / myfolder [แพ็คเกจ]

ตรวจสอบการติดตั้งพึ่งพาแล้ว จะติดตั้งแพ็คเกจลงใน /myfolder/lib/python3.5/site-packages/ [แพ็คเกจ]

pip install - root / myfolder [แพ็คเกจ]

ตรวจสอบการขึ้นต่อกันเช่น --prefix แต่ตำแหน่งการติดตั้งจะเป็น

pip install --user [แพ็คเกจ]

จะติดตั้งแพ็กเกจลงใน $ HOME: /home/هUSEROWN/.local/lib/python3.5/site-packages Python ค้นหาโดยอัตโนมัติจากเส้นทาง. local นี้ดังนั้นคุณไม่จำเป็นต้องใส่มันลงใน PYTHONPATH ของคุณ

=> ในกรณีส่วนใหญ่ --user เป็นตัวเลือกที่ดีที่สุดที่จะใช้ ในกรณีที่ไม่สามารถใช้โฟลเดอร์บ้านได้ด้วยเหตุผลบางประการ --prefix


ทำงานภายใต้ python 2.7.16, --target (หรือ --prefix) ติดตั้ง Jinja2-2.10.1.dist-info / เช่นในขณะที่ติดตั้ง --install-option = "- คำนำหน้าติดตั้ง Jinja2-2.10.1-py2 .7.egg-info / ซึ่งเป็นสิ่งที่ฉันต้องการจริง ๆ
Greg Dougherty

13

เวอร์ชันที่ใหม่กว่าpip(8 หรือใหม่กว่า) สามารถใช้--prefixตัวเลือกได้โดยตรง:

pip install --prefix=$PREFIX_PATH package_name

โดยที่$PREFIX_PATHเป็นคำนำหน้าการติดตั้งที่วาง lib, bin และโฟลเดอร์ระดับบนสุดอื่น ๆ



4

เพื่อเพิ่มคำแนะนำที่ดีอยู่แล้วเนื่องจากฉันมีปัญหาในการติดตั้งIPythonเมื่อฉันไม่มีสิทธิ์ในการเขียน/usr/localเมื่อฉันไม่ได้มีสิทธิ์ในการเขียน

pip ใช้ distutils เพื่อทำการติดตั้งและเธรดนี้อธิบายถึงวิธีการที่อาจทำให้เกิดปัญหาตามที่อาศัยsys.prefixตั้งค่า

ปัญหาของฉันเกิดขึ้นเมื่อมีการติดตั้ง IPython พยายามที่จะเขียนไป '/ usr / local / share / คน / man1' มีสิทธิ์ที่ถูกปฏิเสธ เนื่องจากการติดตั้งล้มเหลวดูเหมือนจะไม่เขียนไฟล์ IPython ในไดเรกทอรี bin

การใช้ "--user" ใช้งานได้และไฟล์ถูกเขียนไปที่ ~ / .local การเพิ่ม ~ / .local / bin ไปยัง $ PATH หมายความว่าฉันสามารถใช้ "ipython" ได้จากที่นั่น

อย่างไรก็ตามฉันพยายามที่จะติดตั้งสิ่งนี้กับผู้ใช้จำนวนหนึ่งและได้รับอนุญาตให้เขียนใน/usr/local/lib/python2.7ไดเรกทอรี ฉันสร้างไดเรกทอรี "bin" ใต้นั้นและตั้งค่าคำสั่งสำหรับ distutils:

vim ~/.pydistutils.cfg

[install]
install-data=/usr/local/lib/python2.7
install-scripts=/usr/local/lib/python2.7/bin

จากนั้น ( -Iใช้เพื่อบังคับให้ติดตั้งแม้จะมีความล้มเหลวก่อนหน้า /. local ติดตั้ง):

pip install -I ipython

แล้วฉันจะเพิ่มไป/usr/local/lib/python2.7/bin$PATH

ฉันคิดว่าฉันจะรวมสิ่งนี้ไว้ในกรณีที่คนอื่นมีปัญหาคล้ายกันในเครื่องที่พวกเขาไม่สามารถเข้าถึง sudo ได้


2

ถ้าคุณใช้ Brew กับ python โชคไม่ดีที่ pip / pip3 มาพร้อมกับตัวเลือกที่ จำกัด มาก คุณไม่มีตัวเลือก --install-option, --target, --user ดังกล่าวข้างต้น

หมายเหตุเกี่ยวกับการติดตั้ง pip --user การติดตั้ง pip --user
ปกติจะถูกปิดการใช้งานสำหรับการต้ม Python นี่เป็นเพราะบั๊กใน distutils เนื่องจาก Homebrew เขียน distutils.cfg ซึ่งตั้งค่าคำนำหน้าแพ็คเกจ วิธีแก้ปัญหาที่เป็นไปได้ (ซึ่งทำให้สคริปต์ที่เรียกใช้งานได้ใน ~ / Library / Python /./ bin) คือ: python -m pip install --user --install-option="--prefix=" <package-name>

คุณอาจพบว่าบรรทัดนี้ยุ่งยากมาก ฉันแนะนำให้ใช้ pyenv เพื่อการจัดการ หากคุณกำลังใช้

brew upgrade python python3

แดกดันคุณกำลังลดระดับฟังก์ชั่น pip จริงๆ

(ฉันโพสต์คำตอบนี้เพียงเพราะ pip ​​ใน mac osx ของฉันไม่มีตัวเลือกเป้าหมายและฉันใช้เวลาหลายชั่วโมงในการแก้ไข)


คำตอบนี้มีคำนำหน้าอย่างชัดเจนและignore-installedเนื่องจากความพยายามก่อนหน้านี้ทำงานให้ฉัน:python -m pip install --user --install-option="--prefix='/myFunkyApp/lib'" --ignore-installed <package-name>
Jeremy Jones

0

ด้วย pip v1.5.6บน Python v2.7.3(GNU / Linux) ตัวเลือก--rootช่วยให้สามารถระบุคำนำหน้าการติดตั้งทั่วโลก (เห็นได้ชัด) โดยไม่คำนึงถึงตัวเลือกแพคเกจที่เฉพาะเจาะจง ลอง fi

$ pip install --root=/alternative/prefix/path package_name

0

ฉันแนะนำให้ทำตามเอกสารและสร้างไฟล์ ~ / .pip / pip.conf หมายเหตุในเอกสารประกอบพบว่าไม่มีไดเรกทอรีส่วนหัวที่ระบุซึ่งนำไปสู่ข้อผิดพลาดต่อไปนี้:

error: install-base or install-platbase supplied, but installation scheme is incomplete

เนื้อหาการทำงานที่สมบูรณ์ของไฟล์ conf คือ:

[install]
install-base=$HOME
install-purelib=python/lib
install-platlib=python/lib.$PLAT
install-scripts=python/scripts
install-headers=python/include
install-data=python/data

โชคไม่ดีที่ฉันสามารถติดตั้งได้ แต่เมื่อพยายามถอนการติดตั้ง pip บอกฉันว่าไม่มีแพ็คเกจดังกล่าวสำหรับกระบวนการถอนการติดตั้ง .... ดังนั้นมีบางสิ่งผิดปกติ แต่แพคเกจไปยังตำแหน่งที่กำหนดไว้ล่วงหน้า


0

pip install /path/to/package/

เป็นไปได้ตอนนี้

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

ซึ่งหมายความว่าหากคุณลบ / ย้ายแพ็คเกจไปยังโฟลเดอร์อื่นคุณจะไม่สามารถใช้งานได้


สิ่งนี้ไม่ตอบคำถาม
Clintm

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