การเปลี่ยนชื่อโฟลเดอร์ virtualenv โดยไม่ทำลาย


162

ฉันได้สร้างโฟลเดอร์และเริ่มต้นอินสแตนซ์ virtualenv ในนั้น

$ mkdir myproject
$ cd myproject
$ virtualenv env

เมื่อฉันรัน(env)$ pip freezeมันจะแสดงแพ็คเกจที่ติดตั้งตามที่ควร

ตอนนี้ผมต้องการที่จะเปลี่ยนชื่อไปmyproject/project/

$ mv myproject/ project/

อย่างไรก็ตามตอนนี้เมื่อฉันวิ่ง

$ . env/bin/activate
(env)$ pip freeze

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


1
คำถามนี้เก่าและมีคำตอบอยู่แล้ว แต่ฉันต้องสงสัยว่าทำไม OP ไม่สามารถย้าย virtualenv กลับไปที่เดิมได้ เห็นได้ชัดว่านั่นไม่ได้แก้ปัญหาความต้องการที่จะย้าย / เปลี่ยนชื่อ แต่จะไม่คืนค่า virtualenv ที่ใช้งานได้หรือว่ามันขาดอยู่แล้วอย่างสิ้นหวัง
Malik A. Rumi

2
ใช่คุณพูดถูกมันจะซ่อมแซม virtual env แต่ไม่แก้ปัญหา
Florian

พ.ย. 2019, Python3 ทางออกที่ดีที่สุดสำหรับฉันอธิบายไว้ในaarongorka.com/blog/portable-virtualenv
Samir Sadek

คำตอบ:


148

คุณต้องปรับการติดตั้งเพื่อใช้เส้นทางสัมพัทธ์ virtualenvให้สำหรับ--relocatableตัวเลือกนี้ จากเอกสาร :

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

$ virtualenv - relocatable ENV

หมายเหตุ: ENV เป็นชื่อของสภาพแวดล้อมเสมือนจริงและคุณต้องเรียกใช้จากนอกไดเรกทอรี ENV

สิ่งนี้จะทำให้ไฟล์บางไฟล์ที่สร้างโดย setuptools หรือแจกจ่ายใช้เส้นทางสัมพัทธ์และจะเปลี่ยนสคริปต์ทั้งหมดเพื่อใช้ enable_this.py แทนที่จะใช้ตำแหน่งของล่าม Python เพื่อเลือกสภาพแวดล้อม

หมายเหตุ: คุณต้องรันสิ่งนี้หลังจากติดตั้งแพ็กเกจใด ๆ ลงในสภาพแวดล้อม หากคุณทำให้สภาพแวดล้อม relocatable แล้วติดตั้งแพคเกจใหม่คุณต้องเรียกใช้ virtualenv - relocatable อีกครั้ง


2
ข้อแม้: การเปลี่ยน env เป็น relocatable ทำได้มากกว่าแค่ให้คุณย้ายโฟลเดอร์ (ดูหมายเหตุ:คัดลอกมาจากเอกสาร) ... มันอาจมีผลข้างเคียง
Ben Roberts

7
ตัวเลือก - relocatable ปัจจุบันมีจำนวนของปัญหาและไม่รับประกันว่าจะทำงานในทุกสถานการณ์ เป็นไปได้ว่าตัวเลือกจะถูกเลิกใช้ใน virtualenv รุ่นอนาคต นอกจากนี้สิ่งนี้ไม่ได้ทำให้แพ็คเกจของคุณข้ามแพลตฟอร์ม คุณสามารถย้ายไดเรคทอรี่ไปได้ แต่สามารถใช้ได้กับคอมพิวเตอร์ที่คล้ายคลึงกันเท่านั้น
Demz

1
@TheDemz grep -EIr '\Wold_venv_name\W' /path/to/new_venvจะช่วยค้นหา shabangs ที่ใช้ venv เก่า ๆ แต่ไม่ใช่ verifcation ที่สมบูรณ์ของ venv ที่ถูกย้ายไป
เตาอบ

2
นอกจากนี้คุณจะต้องแก้ไข.projectไฟล์virtualenvwrapper ซึ่งมีเส้นทางไปยังซอร์สโค้ดที่ขึ้นอยู่กับ virtualenv สมมติว่าคุณใช้ virutalenvwrapper และเปลี่ยนชื่อโปรเจ็กต์ dir ให้ตรงกับ virtualenv ใหม่
เตาอบ

ฉันต้องปิด virtualenv ก่อนใช้งาน
antonagestam

108

ผมเชื่อว่า"รู้ว่าทำไม" เรื่องมากไปกว่า "รู้วิธี" ดังนั้นนี่เป็นอีกวิธีหนึ่งในการแก้ไขปัญหานี้

เมื่อคุณเรียกใช้. env/bin/activateมันจะเรียกใช้งานคำสั่งต่อไปนี้ ( /tmpตัวอย่างเช่น):

VIRTUAL_ENV="/tmp/myproject/env"
export VIRTUAL_ENV

แต่คุณได้เปลี่ยนชื่อเป็นเพียงแค่myprojectการprojectเพื่อให้คำสั่งที่ล้มเหลวในการดำเนินการ นั่นคือเหตุผลที่มันพูดpip is not installedเพราะคุณไม่ได้ติดตั้งpipในสภาพแวดล้อมส่วนกลางของระบบและ virtualenv ของคุณpipไม่ได้รับแหล่งที่มาอย่างถูกต้อง

หากคุณต้องการแก้ไขด้วยตนเองนี่คือวิธี:

  1. ด้วยโปรแกรมแก้ไขรายการโปรดของคุณเช่น Vim /tmp/project/env/bin/activateมักแก้ไขในบรรทัดที่ 42:

    VIRTUAL_ENV='/tmp/myproject/env' => VIRTUAL_ENV='/tmp/project/env'

  2. แก้ไข/tmp/project/env/bin/pipในบรรทัด 1:

    #!/tmp/myproject/env/bin/python => #!/tmp/project/env/bin/python

หลังจากนั้นเปิดใช้งานสภาพแวดล้อมเสมือนจริงของคุณenvอีกครั้งและคุณจะเห็นว่าคุณpipได้กลับมาอีกครั้ง


6
หากต้องการเปลี่ยนพา ธ ด้วยตนเองคุณควรสังเกตว่ามีไฟล์ฮาร์ดโค้ดมากกว่าสองไฟล์ grep -iHnR venv-name /path/to/venv-name | grep -v "^Binary file" | grep -i venv-nameพบพวกเขาทั้งหมดกับสิ่งที่ต้องการ: ในความเป็นจริงฉันสังเกตเห็นว่าในหนึ่งในกรณีของฉัน Django แพ็คเกจจำนวนมากมี "เส้นทางสู่ Python sh-bang" ในพวกเขา
Kevin

สิ่งนี้ช่วยฉันได้มาก ฉันต้องการรู้ว่าทำไม ... ขอบคุณ!
Jarvis

ในทางตรงกันข้ามกับความคิดเห็นของ Keven ข้างต้นผมพบว่าการแก้ไขทั้งสองสายแก้ปัญหาสำหรับผมเกี่ยวกับการเคลื่อนย้ายvirtualenvของ อาจมีกรณีการใช้งานบางอย่างที่ฉันไม่ได้ใช้และไม่พบปัญหา
Deleet

เกาว่า! วันนี้ผมวิ่งเข้าไปในปัญหา: ipython virtualenvจะไม่ทำงานภายใน เพื่อแก้ปัญหานี้ฉันแก้ไขส่วนหัวของ bash (มันเรียกว่าอะไร?) ในipythonไฟล์จากนั้นก็ใช้งานได้ดี
Deleet

อืมสิ่งนี้ไม่ได้ผลสำหรับฉันและดูเหมือนว่าสคริปต์การเปิดใช้งานของฉันไม่มี Line 1 ที่อ้างถึงที่นี่ในขั้นตอนที่ 2 มีการเปลี่ยนแปลงบางอย่างหรือไม่
Evan Zamir

40

หมายเหตุ:เป็น @jb ชี้ให้เห็นวิธีการแก้ปัญหานี้จะใช้เพื่อให้ง่าย (อีกครั้ง) ที่สร้างvirtualenvs หากสภาพแวดล้อมใช้เวลาหลายชั่วโมงในการติดตั้งโซลูชันนี้ไม่แนะนำ


Virtualenvs นั้นยอดเยี่ยมเพราะง่ายต่อการสร้างและสลับไปมา พวกเขาป้องกันคุณจากการล็อคเข้ากับการกำหนดค่าเดียว หากคุณทราบข้อกำหนดของโครงการหรือรับได้ทำใหม่virtualenv :

  • สร้างrequirements.txtไฟล์

    (env)$ pip freeze > requirements.txt

    • ถ้าคุณไม่สามารถสร้างrequirements.txtแฟ้มตรวจสอบก่อนที่จะลบเดิมenv/lib/pythonX.X/site-packagesenv
  • ลบที่มีอยู่ (env)

    deactivate && rm -rf env

  • สร้างvirtualenvข้อกำหนดใหม่เปิดใช้งานและติดตั้ง

    virtualenv env && . env/bin/activate && pip install -r requirements.txt


หรือใช้ virtualenvwrapper เพื่อทำให้สิ่งต่าง ๆ ง่ายขึ้นเล็กน้อยเนื่องจาก virtualenvs ทั้งหมดจะถูกเก็บไว้ในตำแหน่งส่วนกลาง

$(old-venv) pip freeze > temp-reqs.txt
$(old-venv) deactivate
$ mkvirtualenv new-venv
$(new-venv) pip install -r temp-reqs.txt
$(new-venv) rmvirtualenv old-venv

6
ดีสำหรับบางคนpip install -r requirements.txtใช้เวลาสองสามชั่วโมง (รวบรวม C-Extensions ของบุคคลที่สามบนราสเบอร์รี่ pi)
jb

4
บางทีอาจเป็นเรื่องจริง แต่นั่นก็ดูเหมือนว่าเป็นกรณีที่ขอบสำหรับฉัน ฉันยังคิดว่านี่อาจเป็นทางออกที่ทำงานได้สำหรับหลายกรณี
bnjmn

Yah หลายโครงการ (ตัวอย่างเช่นเว็บไซต์ Django) ใช้เวลาเพียง 30 วินาทีในการติดตั้งทุกอย่างแม้ว่าพวกเขาจะมีการอ้างอิงสองโหล (หากคุณดาวน์โหลดทุกอย่างก่อนและใช้ '- ไม่มีดัชนี - ค้นหาลิงค์ = downloadDir' )
Jonathan Hartley

1
@bnjmn หนึ่งซับvirtualenv env && pip install -r requirements.txtจะไม่ติดตั้งข้อกำหนดในสภาพแวดล้อมใหม่เพราะคุณไม่ได้เปิดใช้งาน
Yarin

1
@Yarin ขอบคุณที่ชี้ให้เห็น ฉันคิดถึงมันทั้งหมดเป็นvirtualenv-wrapperผู้ใช้ตัวเอง (ซึ่งเปิดใช้งานโดยอัตโนมัติในการสร้าง) ฉันได้อัปเดตคำตอบของฉันเพื่อรวมการเปิดใช้งานโดยvirtualenvหวังว่าจะหลีกเลี่ยงความสับสน
bnjmn

28

ฉันมักจะติดตั้ง virtualenvwrapper เพื่อช่วยออก จาก shell prompt:

pip install virtualenvwrapper

มีวิธีบันทึกไว้ในเอกสาร virtualenvwrapper - cpvirtualenv นี่คือสิ่งที่คุณทำ ตรวจสอบให้แน่ใจว่าคุณไม่อยู่ในสภาพแวดล้อมของคุณและกลับไปที่เชลล์พรอมต์ พิมพ์ชื่อนี้ด้วยชื่อที่ต้องการ:

cpvirtualenv oldenv newenv

จากนั้นหากจำเป็น:

rmvirtualenv oldenv

หากต้องการไปที่ newenv ของคุณ:

workon newenv

1
คำตอบของ Afrowave ควรเป็นวิธีที่ยอมรับได้จริง ๆ
Jaxian

นี้จะทำงานเฉพาะหากมีการใช้ไม่เพียงvirtualenvwrapper คำตอบจาก @ryankdwyer นี้ดีกว่า virtualenv
LS

ฉันแก้ไขคำตอบของฉันเพื่อสะท้อนว่าควรติดตั้ง 'virtualenvwrapper' สมมติว่าการเปลี่ยนชื่อสภาพแวดล้อมเสมือนเกิดขึ้นมากมายฉันจะแนะนำวิธีนี้
Afrowave

แม้ว่ามันจะใช้ virtualenvwrapper แต่ก็เป็นระบบที่ง่ายที่สุด และมันใช้งานได้ดี
blasrodri

17

คุณสามารถแก้ไขปัญหาของคุณได้โดยทำตามขั้นตอนเหล่านี้:

  1. เปลี่ยนชื่อไดเรกทอรีของคุณ
  2. รันสิ่งนี้อีกครั้ง: $ virtualenv ..\path\renamed_directory
  3. virtualenv จะแก้ไขการเชื่อมโยงไดเรกทอรีในขณะที่ออกจากแพ็คเกจของคุณ
  4. $ scripts/activate
  5. $ pip freeze เพื่อยืนยันแพ็คเกจของคุณ
  6. ข้อแม้ที่สำคัญหากคุณมีการอ้างอิงพา ธ แบบคงที่ในไฟล์สคริปต์ในไดเรกทอรี virtualenv ของคุณคุณจะต้องเปลี่ยนสิ่งเหล่านั้นด้วยตนเอง

1
นี่เป็นทางออกที่ดีสำหรับฉัน เนื่องจากวิธีนี้อาจหลีกเลี่ยงปัญหาที่เกี่ยวข้องได้--relocatableฉันคิดว่าวิธีนี้ดีกว่าคำตอบที่ยอมรับ จนถึงตอนนี้ผมได้สังเกตเห็นว่าหลาย ๆ.pycไฟล์ในยังคงอ้างถึง_new_name_/lib/python2.7 _old_name_อย่างไรก็ตามนั่นไม่ได้ส่งผลกระทบต่อการทำงานของสภาพแวดล้อมของฉัน อาจเป็นทางออกเดียวที่ดีกว่าคือการใช้virtualenvwrapperหรือสาธารณูปโภคอื่น ๆ ที่ระบุไว้ในคำตอบที่นี่ อย่างน้อยโซลูชันนี้ไม่จำเป็นต้องติดตั้งโปรแกรมเพิ่มเติม
LS

ทำงานเหมือนจับใจ!
AmirHossein

13

ยังมีอีกวิธีหนึ่งที่ใช้งานได้สำหรับฉันหลายครั้งโดยไม่มีปัญหาคือvirtualenv-clone :

pip install virtualenv-clone
virtualenv-clone old-dir/env new-dir/env

ควรทำเครื่องหมายเป็นคำตอบที่ดีที่สุด ลงมือ! ต้องใช้เวลาสักพักจึงจะมีความอดทน
Amitrajit Bose

virtualenv-clone ละเลยการอัพเดตพรอมต์ ต้องไปทำด้วยตนเอง นอกเหนือจากนั้นมันยอดเยี่ยม
user3667349

5

(ภายในโฟลเดอร์โครงการ)

cd bin
sed -i 's/old_dir_name/new_dir_name/g' *

อย่าลืมปิดใช้งานและเปิดใช้งาน


ทำได้ดี; หรือสำหรับเส้นทาง Linux:sed -i "s|$old_dir|$new_dir|g" bin/*
Destroyica

sed -i '.original' 's/old_dir_name/new_dir_name/g' *สำหรับ mac
อเล็กซ์

1

virtualenv --relocatable ENVไม่ใช่ทางออกที่ต้องการ ฉันคิดว่าคนส่วนใหญ่ต้องการความสามารถในการเปลี่ยนชื่อ virtualenv โดยไม่มีผลข้างเคียงในระยะยาว

ดังนั้นฉันจึงสร้างเครื่องมือง่ายๆที่จะทำเช่นนั้น หน้าโปรเจ็กต์สำหรับvirtualenv-mvแสดงรายละเอียดเพิ่มเติมเล็กน้อย แต่โดยพื้นฐานแล้วคุณสามารถใช้งานได้virtualenv-mvเหมือนกับที่คุณใช้งานง่าย ๆmv(โดยไม่มีตัวเลือกใด ๆ )

ตัวอย่างเช่น:

virtualenv-mv myproject project

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

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