Virtualenv - ไม่มีแพ็คเกจไซต์และ pip ​​ยังคงค้นหาแพ็คเกจทั่วโลกอยู่หรือไม่


140

ฉันรู้สึกประทับใจที่virtualenv --no-site-packagesจะสร้างสภาพแวดล้อม Python ที่แยกออกจากกันอย่างสิ้นเชิง แต่ดูเหมือนจะไม่เป็นเช่นนั้น

ตัวอย่างเช่นฉันติดตั้ง python-django ไว้ทั่วโลก แต่ต้องการสร้าง Virtualenv ด้วย Django เวอร์ชันอื่น

$ virtualenv --no-site-packages foo       
New python executable in foo/bin/python
Installing setuptools............done.
$ pip -E foo install Django
Requirement already satisfied: Django in /usr/share/pyshared
Installing collected packages: Django
Successfully installed Django

จากสิ่งที่ฉันบอกได้pip -E foo installข้างต้นควรจะติดตั้ง Django เวอร์ชันใหม่อีกครั้ง นอกจากนี้ถ้าฉันบอกให้ pip ตรึงสภาพแวดล้อมฉันจะได้รับแพ็คเกจมากมาย ฉันคาดหวังว่าสำหรับสภาพแวดล้อมที่สดใหม่ด้วย--no-site-packagesสิ่งนี้จะว่างเปล่า?

$ pip -E foo freeze
4Suite-XML==1.0.2
BeautifulSoup==3.1.0.1
Brlapi==0.5.3
BzrTools==1.17.0
Django==1.1
... and so on ...

ฉันเข้าใจผิดว่า--no-site-packagesควรจะทำงานอย่างไร?


4
FYI - ไม่มีการเลิกใช้งานแพ็กเกจไซต์ ดูที่นี่
Salem Ben Mabrouk

@SalemBenMabrouk ลิงค์เสียลิงค์ใหม่ที่นี่. ปัญหาที่เกี่ยวข้องกับ Github: การตั้งค่าสถานะ "--no-site-Packages" เพิ่งหายไปหรือไม่
Ynjxsjmh

1
ในลิงก์นั้นระบุว่า--no-site-packagesเลิกใช้แล้ว เก็บไว้เพื่อความเข้ากันได้แบบย้อนหลังเท่านั้น การไม่สามารถเข้าถึงแพ็คเกจไซต์ส่วนกลางได้กลายเป็นลักษณะการทำงานเริ่มต้นแล้ว --system-site-packagesหากคุณต้องการการเข้าถึงเว็บไซต์แพคเกจระดับโลกที่คุณอาจเปิดใช้งาน
Ynjxsjmh

คำตอบ:


109

ฉันมีปัญหาเช่นนี้จนกระทั่งฉันตระหนักว่า (นานก่อนที่ฉันจะค้นพบ Virtualenv) ฉันได้เพิ่มไดเร็กทอรีไปยัง PYTHONPATH ในไฟล์. bashrc ของฉัน เป็นเวลากว่าหนึ่งปีก่อนหน้านี้ฉันไม่ได้คิดถึงเรื่องนั้นในทันที


13
ผู้กล้าของฉัน! หากคุณต้องการตรวจสอบว่าเป็นปัญหาของคุณอย่างรวดเร็วจริงๆหรือไม่คุณสามารถเรียกใช้ printenv เพื่อดูว่ามี PYTHONPATH อยู่หรือไม่และถ้าเป็นเช่นนั้นให้เรียกใช้ PYTHONPATH ที่ไม่ได้ตั้งค่า คุณยังคงต้องติดตามปัญหาหากคุณไม่ต้องการให้ปัญหาปรากฏขึ้นอีกต่อไป แต่นั่นจะช่วยให้คุณได้รับ Virtualenv ใหม่ที่ตั้งค่าในเซสชันเชลล์ปัจจุบัน
UltraBob

Homebrew ก็ทำเช่นนี้เช่นกัน!
ร็อบ

1
ฉันหวังว่าฉันจะโหวตให้คุณมากขึ้น ฉันมาที่หน้านี้มากกว่าหนึ่งครั้งหลังจากพบกับสิ่งต่างๆที่เป็นเพราะ PYTHONPATH ของฉันถูกตั้งค่าไว้แล้ว
Bemmu

ฉันรู้ว่านี่เป็นโพสต์เก่า ๆ (จริงๆ) แต่ฉันได้ค้นหาทุกที่รวมถึงการถามคำถามของตัวเองเกี่ยวกับ SO แต่ฉันไม่สามารถหาวิธี--no-site-packagesไปทำงานได้ ฉันเข้าใกล้แค่เช็ด ubuntu และดูว่ามันช่วยแก้ปัญหาได้หรือไม่ ตอนแรกฉันคิดว่าฉันกำลังมีปัญหา PYTHONPATH เหมือนกัน แต่เมื่อวิ่งprintenvฉันมองไม่เห็น ความขุ่นมัวกำลังเพิ่มขึ้นและความช่วยเหลือใด ๆ ที่ได้รับการชื่นชมมาก sys.path ของฉันจากภายใน venv ที่สร้างขึ้นด้วย--no-site-packagesดูเหมือนจะรวมไดเร็กทอรีแพ็กเกจทั้งหมดของฉัน ฉันไม่ได้คิดว่าจะแก้ไขสิ่งนี้ได้อย่างไร ช่วยด้วย?
NotAnAmbiTurner

1
การลบ PYTHONPATH จาก printenv ไม่ได้ช่วย
Miroslav Radojević

29

คุณต้องแน่ใจว่าคุณกำลังรันpipไบนารีในสภาพแวดล้อมเสมือนที่คุณสร้างขึ้นไม่ใช่แบบโกลบอล

env/bin/pip freeze

ดูการทดสอบ:

เราสร้าง Virtualenv ด้วย--no-site-packagesตัวเลือก:

$ virtualenv --no-site-packages -p /usr/local/bin/python mytest
Running virtualenv with interpreter /usr/local/bin/python
New python executable in mytest/bin/python
Installing setuptools, pip, wheel...done.

เราตรวจสอบผลลัพธ์freezeจากสิ่งที่สร้างขึ้นใหม่pip:

$ mytest/bin/pip freeze
argparse==1.3.0
wheel==0.24.0

แต่ถ้าเราใช้ทั่วโลกpipนี่คือสิ่งที่เราได้รับ:

$ pip freeze
...
pyxdg==0.25
...
range==1.0.0
...
virtualenv==13.1.2

นั่นคือแพ็คเกจทั้งหมดที่pipติดตั้งในระบบทั้งหมด โดยการตรวจสอบwhich pipเราได้รับ (อย่างน้อยในกรณีของฉัน) สิ่งที่ต้องการ/usr/local/bin/pipซึ่งหมายความว่าเมื่อเราทำมันจะเรียกไบนารีแทนนี้pip freezemytest/bin/pip


ผมมีปัญหาเหมือนกัน. ฉันสงสัยว่ามันเกิดขึ้นได้อย่างไรเนื่องจากในตอนแรกที่เรียก pip freeze แสดงให้ฉันเห็นแพ็คเกจที่ถูกต้อง แต่สองสามวันต่อมามันเริ่มโทรหาแพ็คเกจที่อยู่ที่ / usr / local / bin / ...
jimijazz

1
นี่เป็นปัญหาสำหรับฉัน: ฉันใช้นามแฝงpipไปยังเส้นทางเฉพาะไปยัง global pip ซึ่งไม่ได้ถูกแทนที่เมื่อเปิดใช้งาน Virtualenv
merlinND

1
คุณเพิ่งช่วยฉันสิ่งนี้ใช้ได้ดีสำหรับฉัน (pip3 และ python3.7) ขอบคุณ
Saed Yousef

24

ในที่สุดฉันก็พบว่าไม่ว่าด้วยเหตุผลใด pip -E จึงไม่ทำงาน อย่างไรก็ตามหากฉันเปิดใช้งาน Virtualenv จริงและใช้ easy_install ที่ได้รับจาก Virtualenv เพื่อติดตั้ง pip จากนั้นใช้ pip โดยตรงจากภายในดูเหมือนว่าจะทำงานตามที่คาดไว้และแสดงเฉพาะแพ็คเกจใน Virtualenv เท่านั้น


2
FWIW ด้วย pip เวอร์ชัน trunk ปัจจุบันและ Virtualenv เวิร์กโฟลว์ดั้งเดิมของคุณตอนนี้ทำสิ่งที่ถูกต้องสำหรับฉันแล้ว ที่กล่าวว่าโดยส่วนตัวฉันยังคงหลีกเลี่ยง -E และเพียงแค่ติดตั้ง pip ในแต่ละ Virtualenv
Carl Meyer

17

ฉันรู้ว่านี่เป็นคำถามเก่ามาก แต่สำหรับผู้ที่มาถึงที่นี่กำลังมองหาวิธีแก้ไข:

อย่าลืมที่จะเปิดใช้งาน virtualenv ( source bin/activate) pip freezeก่อนที่จะใช้ มิฉะนั้นคุณจะได้รับรายชื่อแพ็คเกจทั่วโลกทั้งหมด


ขอบคุณมากสำหรับสิ่งนี้ฉันรู้ว่าฉันต้องใช้แหล่งที่มากับ Virtualenv แต่ไม่ใช่สำหรับ Virtualenvwrapper และฉันไม่เคยได้ยินเรื่อง pip freeze ขอบคุณอีกครั้ง
Deepend

คำตอบที่ถูกต้อง หลังจากเริ่มต้น Virtualenv คุณต้องเปิดใช้งานมิฉะนั้นคุณจะใช้ python เวอร์ชันระบบ
AsAP_Sherb

17

ล้างชั่วคราวPYTHONPATHด้วย:

export PYTHONPATH=

จากนั้นสร้างและเปิดใช้งานสภาพแวดล้อมเสมือน:

virtualenv foo
. foo/bin/activate

แล้วเท่านั้น:

pip freeze

พยายามทำความสะอาด PYTHONPATH ด้วย PYTHONPATH ที่ไม่ได้ตั้งค่าและส่งออก PYTHONPATH = และไม่มีวิธีใดช่วยได้
Miroslav Radojević

15

--no-site-packagessys.pathควรเป็นชื่อที่แสดงให้เห็นเอาไดเรกทอรีเว็บไซต์แพคเกจมาตรฐานจาก สิ่งอื่นใดที่อาศัยอยู่ในเส้นทาง Python มาตรฐานจะยังคงอยู่ที่นั่น


1
สำหรับฉันทำความสะอาดPYTHONPATHด้วยexport PYTHONPATH=ดูเหมือนจะทำเคล็ดลับ
ต้นสนชนิดหนึ่ง

พยายามทำความสะอาด PYTHONPATH ด้วย PYTHONPATH ที่ไม่ได้ตั้งค่าและส่งออก PYTHONPATH = และไม่มีวิธีใดช่วยได้ การเรียก python3 -m venv ./venv_dir ยังคงเพิ่มแพ็คเกจระดับระบบ เมื่อเปิดใช้งาน pip freeze จะแสดงรายการแพ็กเกจที่ติดตั้งไว้ก่อนหน้านี้ในระดับระบบแทนที่จะเป็นสภาพแวดล้อมเสมือนที่สะอาด ใครช่วยแนะนำวิธีแก้ปัญหาอื่น ๆ ได้ไหม
Miroslav Radojević

4

ปัญหาที่คล้ายกันนี้อาจเกิดขึ้นได้บน Windows หากคุณเรียกใช้สคริปต์โดยตรงscript.pyซึ่งจะใช้ตัวเปิดเริ่มต้นของ Windows และเปิด Python นอกสภาพแวดล้อมเสมือน การเรียกมันด้วยpython script.pyจะใช้ Python กับสภาพแวดล้อมเสมือนจริง


ควรมีบรรทัด Shebang ที่ด้านบนของสคริปต์ (เริ่มต้นด้วย '! #') ซึ่งจะชี้ไปที่การตีความที่ใช้
wobbily_col

2

สิ่งนี้ดูเหมือนจะเกิดขึ้นเมื่อคุณย้ายไดเร็กทอรี Virtualenv ไปยังไดเร็กทอรีอื่น (บน linux) หรือเปลี่ยนชื่อไดเร็กทอรีหลัก


1

ฉันมีปัญหาเดียวกันนี้ ปัญหาสำหรับผม (บน Ubuntu) $เป็นว่าชื่อเส้นทางของฉันที่มีอยู่ เมื่อฉันสร้าง Virtualenv นอก $ dir มันก็ใช้ได้ดี

แปลก.


1

สาเหตุที่เป็นไปได้อย่างหนึ่งที่ทำให้ pip Virtualenv ไม่ทำงานคือถ้าโฟลเดอร์หลักใด ๆ มีพื้นที่ว่างในชื่อที่/Documents/project name/app เปลี่ยนชื่อเพื่อ/Documents/projectName/appแก้ปัญหา


0

นี่คือรายการของตัวเลือกการติดตั้ง pip ทั้งหมด- ฉันไม่พบ-Eตัวเลือก ' ' ใด ๆ เลยอาจเป็นเวอร์ชันเก่ากว่าก็ได้ ด้านล่างนี้ฉันกำลังแบ่งปันการใช้งานภาษาอังกฤษธรรมดาและการทำงานvirtualenvสำหรับผู้ใช้ SO ที่กำลังจะมาถึง


ทุกอย่างดูเหมือนจะดียอมรับการเปิดใช้งานvirtualenv( foo) เพียงแค่อนุญาตให้เรามีสภาพแวดล้อม python หลาย (และแตกต่างกัน) เช่น Python เวอร์ชันต่างๆหรือ Django เวอร์ชันต่างๆหรือแพ็คเกจ Python อื่น ๆ - ในกรณีที่เรามีเวอร์ชันก่อนหน้าในการผลิตและต้องการทดสอบ Django รุ่นล่าสุดด้วยของเรา ใบสมัคร

ในการสร้างและใช้งาน (เปิดใช้งาน) สภาพแวดล้อมเสมือน ( virtualenv) สั้น ๆ ทำให้สามารถเรียกใช้หรือทดสอบแอปพลิเคชันของเราหรือสคริปต์ Python แบบง่ายด้วยตัวแปล Python ที่แตกต่างกันเช่น Python 2.7 และ 3.3 - สามารถติดตั้งใหม่ (ใช้--no-site-packagesตัวเลือก) หรือแพ็คเกจทั้งหมดจากที่มีอยู่ / การตั้งค่าล่าสุด (ใช้--system-site-packagesตัวเลือก) ในการใช้งานเราต้องเปิดใช้งาน:

$ pip install djangoจะติดตั้งลงในแพ็คเกจไซต์ส่วนกลางและในทำนองเดียวกันการรับpip freezeจะให้ชื่อของแพ็คเกจไซต์ส่วนกลาง

ในขณะที่อยู่ในการดำเนินการ venv dir (foo) $ source /bin/activateจะเปิดใช้งาน venv กล่าวคือตอนนี้ทุกสิ่งที่ติดตั้งด้วย pip จะถูกติดตั้งใน env เสมือนเท่านั้นและตอนนี้การหยุด pip จะไม่ให้รายการแพ็คเกจ python ของไซต์ส่วนกลาง เมื่อเปิดใช้งาน:

$ virtualenv --no-site-packages foo       
New python executable in foo/bin/python
Installing setuptools............done.
$ cd foo
$ source bin/activate 
(foo)$ pip install django

(foo)ก่อนที่$เครื่องหมายจะระบุว่าเรากำลังใช้สภาพแวดล้อม python เสมือนเช่นทุกสิ่งที่มี pip - ติดตั้งหยุดการถอนการติดตั้งจะถูก จำกัด ไว้ที่ venv นี้และไม่มีผลต่อการติดตั้ง / แพ็คเกจ Python ส่วนกลาง / เริ่มต้น


0

ฉันเจอปัญหาเดียวกันกับที่ pip ใน venv ยังคงทำงานเป็น global pip
หลังจากค้นหาหลาย ๆ เพจฉันก็หาวิธีนี้
1. สร้าง Venv ใหม่โดย Virtualenv พร้อมตัวเลือก "--no-site-Packages"

virtualenv --no-site-packages --python=/xx/xx/bin/python my_env_nmae

โปรดทราบว่าแม้ว่าตัวเลือก "--no-site-Packages" จะเป็นค่าเริ่มต้นจริงตั้งแต่ 1.7.0 ในไฟล์ doc ของ Virtualenv แต่ฉันพบว่ามันใช้งานไม่ได้เว้นแต่คุณจะตั้งค่าด้วยตนเอง เพื่อให้ได้ Venv ที่บริสุทธิ์ฉันขอแนะนำอย่างยิ่งให้เปิดตัวเลือกนี้ใน 2 เปิดใช้งาน env ใหม่ที่คุณสร้างขึ้น

source ./my_env_name/bin/activate
  1. ตรวจสอบตำแหน่ง pip และตำแหน่ง python ของคุณและตรวจสอบว่าคำสั่งทั้งสองนี้อยู่ภายใต้สภาพแวดล้อมเสมือนจริง
pip --version
which python
  1. ใช้ pip ภายใต้ virtual env เพื่อติดตั้งแพ็กเกจที่ว่างจาก global package interuption
pip install package_name

หวังว่าคำตอบนี้จะช่วยคุณได้!


Virtualenv ทำงานร่วมกับ python2 โดยค่าเริ่มต้นมันจะถูกแทนที่ด้วย venv ใน python3
Miroslav Radojević

0

ปัญหาของฉันคือpipและpython3เวอร์ชัน สำหรับการdjangoติดตั้งเวอร์ชันล่าสุดpip3จำเป็น ดังนั้นปัญหาของฉันจึงได้รับการแก้ไขหลังจากสร้างสภาพแวดล้อมเสมือนโดยใช้คำสั่งต่อไปนี้:

> virtualenv --python=python3 venv
> source venv/bin/activate
> which pip3 #should be different from /usr/local/bin/pip3
...<some-directory>/venv/bin/pip3

ปล.ปัญหานี้เกิดขึ้นเนื่องจาก python เวอร์ชันเริ่มต้นของฉันใน ubuntu คือ 2.7 การใช้คำสั่งด้านบนจะเป็นการละเว้นเวอร์ชันเริ่มต้น

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