วิธีหลีกเลี่ยง "การอนุญาตถูกปฏิเสธ" เมื่อใช้ pip กับ Virtualenv


95

ฉันพยายามปรับใช้แพ็คเกจ Python pipในสภาพแวดล้อมเสมือนบนเครื่อง Ubuntu แต่พบปัญหาเกี่ยวกับสิทธิ์ ตัวอย่างเช่น:

(TestVirtualEnv)test@testServer:~$ pip install markdown2

สิ้นสุดโดย:

ข้อผิดพลาด: ไม่สามารถสร้าง '/home/test/virtualenvs/TestVirtualEnv/lib/python3.3/site-packages/markdown2.py': ปฏิเสธการอนุญาต

ฉันทำไม่ได้sudoเนื่องจากจะติดตั้งแพ็กเกจทั่วโลกไม่ใช่ในสภาพแวดล้อมเสมือนจริง ฉันchownเอ็ดsite-packages; lsแสดงให้เห็นเพียงไดเรกทอรีที่เกี่ยวข้องกับeasy_install, pipและsetuptoolsและไม่มีอะไรที่เกี่ยวข้องกับ Markdown

วิธีการปรับใช้แพคเกจในสภาพแวดล้อมเสมือนpipโดยไม่พบข้อผิดพลาดเกี่ยวกับสิทธิ์?


เพียงเพื่อชี้แจง: คุณสร้างคุณธรรมนี้ด้วยsudoหรือไม่?
sebastian_oe

@sebastian_oe: ฉันเชื่อว่าฉันทำ ฉันจะสร้างขึ้นมาใหม่เพื่อความแน่ใจ
Arseni Mourzenko

4
นี่อาจเป็นปัญหา ลองสร้าง virtualenv sudoโดยไม่ต้อง
sebastian_oe

1
@sebastian_oe: ฉันสร้างสภาพแวดล้อมเสมือนโดยไม่มีsudoไฟล์. อันที่จริงแพ็คเกจติดตั้งอย่างถูกต้องในขณะนี้ ได้โปรดคุณสามารถส่งเสริมความคิดเห็นของคุณเป็นคำตอบเพื่อให้ฉันยอมรับได้หรือไม่
Arseni Mourzenko

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

คำตอบ:


109

virtualenvปัญหาการอนุญาตอาจเกิดขึ้นเมื่อคุณสร้างvirtualenvเป็นsudoและดำเนินการโดยไม่มีsudoในvirtualenv.

ในฐานะที่พบในความคิดเห็นของคำถามของคุณของการแก้ปัญหาที่นี่คือการสร้างvirtualenvโดยไม่ต้องsudoเพื่อให้สามารถทำงาน (ESP. เขียน) sudoในนั้นโดยไม่ต้อง


5
ถ้าฉันต้องการสร้างใน / opt ที่ต้องใช้ sudo ฉันคิดว่า Virtualenv จะไม่ติดตั้งหากไม่มี sudo
Umair A.

7
@sebastian_oe ฉันคิดว่าฉันรักคุณ
Nobbynob Littlun

5
จะสร้างvirtualenvโดยไม่ใช้ sudo ได้อย่างไร?
Tunn

1
หากคุณสร้าง Virtualenv ด้วยsudoโปรดดูคำตอบโดย @vingtoft สำหรับวิธีการแก้ไขอย่างง่ายดายโดยไม่ต้องสร้างใหม่
David A

106

วิธีการแก้:

หากคุณสร้าง Virtualenv เป็น root ให้รันคำสั่งต่อไปนี้:

sudo chown -R your_username:your_username path/to/virtuaelenv/

วิธีนี้อาจช่วยแก้ปัญหาของคุณได้

ไชโย


1
สิ่งนี้ใช้ได้ผลสำหรับฉัน (chown /usr/local/lib/python3.4) ยกเว้นว่าฉันไม่คิดว่าฉันได้สร้าง Virtualenv เป็นรูทฉันได้ติดตั้ง Python3.4 เป็นรูทแล้ว ฉันยังคงทดสอบอยู่ แต่คุณคิดว่าฉันจะพบปัญหาอะไรอีกในการแก้ปัญหานี้หรือจะแก้ไขข้อผิดพลาดส่วนใหญ่ได้หรือไม่
ntk4

3
คุณจะทราบได้อย่างไรว่าคุณได้สร้าง Virtualenv หรือ python เป็นรูทแล้ว?
A__

สิ่งนี้ช่วยแก้ปัญหาของฉันได้ ฉันอยู่ในสถานการณ์ที่คล้ายกันกับ OP ซึ่งฉันจำเป็นต้องสร้างสภาพแวดล้อมเสมือนในไดเร็กทอรี / opt / ซึ่งฉันไม่สามารถทำได้หากไม่มีสิทธิ์ sudo
sir_chocolate_soup

6

ในกรณีของฉันฉันใช้mkvirtualenvแต่ไม่ได้บอกว่าฉันกำลังจะใช้ python3 ฉันได้รับข้อผิดพลาดนี้:

mkvirtualenv hug
pip3 install hug -U

....
error: could not create '/usr/lib/python3.4/site-packages': Permission denied

มันทำงานหลังจากระบุ python3:

mkvirtualenv --python=/usr/bin/python3 hug
pip3 install hug -U

5

ฉันไม่ได้สร้าง Virtualenv โดยใช้ sudo ดังนั้นคำตอบของเซบาสเตียนจึงใช้ไม่ได้กับฉัน utilsโครงการของฉันถูกเรียกว่า ฉันตรวจสอบutilsไดเรกทอรีและเห็นสิ่งนี้:

-rw-r--r--   1 macuser  staff   983  6 Jan 15:17 README.md
drwxr-xr-x   6 root     staff   204  6 Jan 14:36 utils.egg-info
-rw-r--r--   1 macuser  staff    31  6 Jan 15:09 requirements.txt

ในขณะที่คุณสามารถดูutils.egg-infoเป็นเจ้าของโดยไม่ได้root macuserนั่นคือสาเหตุที่ทำให้ฉันมีpermission deniedข้อผิดพลาด ฉันก็ต้องลบออก/Users/macuser/.virtualenvs/armoury/lib/python2.7/site-packages/utils.egg-linkเนื่องจากมันถูกสร้างขึ้นrootเช่นกัน ฉันทำpip install -e .อีกครั้งหลังจากลบสิ่งเหล่านั้นออกและมันได้ผล


3

หากคุณสร้างสภาพแวดล้อมเสมือนโดยใช้รูทให้ใช้คำสั่งนี้

sudo su

มันจะช่วยให้คุณเข้าถึงรูทจากนั้นเปิดใช้งานสภาพแวดล้อมเสมือนของคุณโดยใช้สิ่งนี้

source /root/.env/ENV_NAME/bin/activate

1

คุณไม่ได้เปิดใช้งานสภาพแวดล้อมเสมือนก่อนที่จะใช้ pip

ลองใช้กับ:

$(your venv path) . bin/activate

จากนั้นใช้ pip -r requirements.txt ในโฟลเดอร์หลักของคุณ


1

ฉันเคยเกิดเหตุการณ์นี้ขึ้นด้วย (โดยบังเอิญ) หลังจากสร้าง venv ใหม่ขณะอยู่ในสภาพแวดล้อมเสมือนที่มีอยู่ วิธีง่ายๆในการวินิจฉัยสิ่งนี้คือการดูว่าpythonมีการเชื่อมโยงไปยังตำแหน่งใดเช่นรัน:

ls -l venv/bin/python

และตรวจสอบให้แน่ใจว่าชี้ไปที่ไบนารี Python ที่เหมาะสม สำหรับระบบส่วนใหญ่จะเป็นหรือ/usr/bin/python ในขณะที่ถ้ามันชี้ไปยังสภาพแวดล้อมเสมือนจริงที่มีอยู่มันจะเป็นสิ่งที่ชอบ/usr/bin/python3 /home/youruser/somedir/bin/pythonถ้าเป็นอย่างหลังฉันขอแนะนำให้สร้าง venv ขึ้นมาใหม่ในขณะที่ตรวจสอบให้แน่ใจว่าคุณไม่ได้ "อยู่ใน" Virtualenv ใด ๆ ที่มีอยู่ (เช่น run deactivate)


โพสต์ที่นี่เนื่องจากเป็นคำถามยอดนิยมที่กล่าวถึงคำหลักที่เหมาะสมจึงมีแนวโน้มที่จะถูกค้นพบและเป็นประโยชน์กับคนอื่น ๆ
Sam Mason

0

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

คุณยังสามารถคัดลอกแพ็คเกจที่ติดตั้งบน global python ไปยัง Virtualenv

cp -r /lib/python/site-packages/* virtualenv/lib/python/site-packages/

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