การอ้างอิงที่ไม่สมบูรณ์ใน Virtualenvs


238

ฉันเพิ่งติดตั้งเครือข่าย dotfiles บน Mac พร้อมกับแอปพลิเคชั่นอื่น ๆ (ฉันเปลี่ยนเป็น iTerm แทน Terminal และ Sublime เป็นโปรแกรมแก้ไขข้อความเริ่มต้นของฉัน) แต่ตั้งแต่นั้นมาสภาพแวดล้อมเสมือนทั้งหมดของฉันหยุดทำงานแม้ว่าโฟลเดอร์ภายใน ยังคงอยู่ที่นั่นและพวกเขาให้ข้อผิดพลาดต่อไปนี้เมื่อใดก็ตามที่ฉันพยายามเรียกใช้สิ่งใด ๆ ในพวกเขา:

dyld: Library not loaded: @executable_path/../.Python
  Referenced from: /Users/[user]/.virtualenvs/modclass/bin/python
  Reason: image not found
Trace/BPT trap: 5

ฉันได้ลบไฟล์ทั้งหมดที่เกี่ยวข้องกับ dotfiles และกู้คืน. bash_profile ของฉันกลับไปเป็นเหมือนเดิม แต่ปัญหายังคงอยู่ มีวิธีใดในการวินิจฉัยปัญหาหรือแก้ไขในวิธีที่ง่าย ๆ (เช่นไม่ต้องการสร้าง virtualenv ทั้งหมดอีกครั้ง)


1
อาจเกี่ยวข้อง: debugfix.com/2011/11/dyld-library-loaded-executable_path-python
unutbu

ขอบคุณสำหรับความคิดเห็น @unubtu สิ่งนี้มีประโยชน์อย่างแน่นอน แต่ฉันก็ไม่สามารถสร้าง virtualenv ใหม่ได้ ฉันrmvirtualenvยังคงทำงาน แต่เมื่อพยายามที่จะวิ่งmkvirtualenvฉันได้รับข้อผิดพลาดต่อไปนี้: -bash: /usr/local/bin/virtualenv: /usr/local/Cellar/python/2.7.6/Frameworks/Python.framework/Versions/2.7/Resour: bad interpreter: No such file or directory ดังนั้นจึงดูเหมือนว่าปัญหาที่มีเส้นทางหลามของฉัน แต่ฉันไม่สามารถดูว่าปัญหาคือตั้งแต่ผมสามารถเรียกใช้งูหลามและมันดูเหมือนดี
oxtay

1
[อัพเดต] ฉันอาจพบปัญหา แต่ฉันไม่แน่ใจและจริง ๆ แล้วฉันไม่แน่ใจว่าจะแก้ไขได้อย่างไร ดูเหมือนว่าvirtualenvคำสั่งทั้งหมดจะทำงานได้ในทางทฤษฎี แต่เนื่องจากมีปัญหากับ python พวกเขาจึงไม่ทำอะไรเลย ดังนั้นปัญหาที่แท้จริงคือการใช้ python ของเบียร์ และฉันสงสัยว่าเหตุผลนั้นเป็นเพราะการเปลี่ยนชื่อในไดเรกทอรีหลาม ด้วยเหตุผลบางคำสั่งทั้งหมดเหล่านี้กำลังมองหาหลามในโฟลเดอร์แต่ชื่อของโฟลเดอร์ที่เป็นจริง/usr/local/Cellar/python/2.7.6 /usr/local/Cellar/python/2.7.6_1
oxtay

ตั้งแต่ฉันเป็นสามเณรฉันไม่ทราบว่าการเปลี่ยนชื่อจาก 2.7.6_1 เป็น 2.7.6 มีความเสี่ยงและดูว่าเกิดอะไรขึ้น
oxtay

คุณควรจะสามารถที่จะเปลี่ยนชื่อไป2.7.6_1 2.7.6หากแย่กว่านั้นแย่ที่สุดคุณสามารถเปลี่ยนชื่อมันได้
unutbu

คำตอบ:


369

ฉันพบวิธีแก้ปัญหาที่นี่ดังนั้นเครดิตทั้งหมดไปที่ผู้เขียน

สรุปสาระสำคัญคือเมื่อคุณสร้าง virtualenv, symlink จำนวนมากถูกสร้างขึ้นเพื่อ Python ติดตั้ง Homebrew

นี่คือตัวอย่างหนึ่ง:

$ ls -la ~/.virtualenvs/my-virtual-env
...
lrwxr-xr-x  1 ryan staff   78 Jun 25 13:21 .Python -> /usr/local/Cellar/python/2.7.7/Frameworks/Python.framework/Versions/2.7/Python
...

เมื่อคุณอัพเกรด Python โดยใช้ Homebrew จากนั้นเรียกใช้brew cleanupsymlink ใน virtualenv ชี้ไปที่พา ธ ที่ไม่มีอยู่อีกต่อไป (เนื่องจาก Homebrew ลบออกไป)

symlink ต้องชี้ไปที่ Python ที่เพิ่งติดตั้งใหม่:

lrwxr-xr-x  1 ryan staff   78 Jun 25 13:21 .Python -> /usr/local/Cellar/python/2.7.8_1/Frameworks/Python.framework/Versions/2.7/Python

ทางออกคือการลบ symlink ใน virtualenv แล้วสร้างใหม่:

find ~/.virtualenvs/my-virtual-env/ -type l -delete
virtualenv ~/.virtualenvs/my-virtual-env

อาจเป็นการดีที่สุดที่จะตรวจสอบว่าลิงก์ใดจะถูกลบก่อนก่อนที่จะลบออก:

find ~/.virtualenvs/my-virtual-env/ -type l

ในความคิดของฉันจะดียิ่งขึ้นเพียงลบ symlinks ที่เสีย คุณสามารถทำได้โดยใช้ GNU find:

gfind ~/.virtualenvs/my-virtual-env/ -type l -xtype l -delete

คุณสามารถติดตั้ง GNU findด้วย Homebrew หากคุณยังไม่มี:

brew install findutils

แจ้งให้ทราบว่าโดยปกติโปรแกรม GNU ติดตั้งกับ Homebrew gมีแนวโน้มที่จะนำหน้าด้วยตัวอักษร นี่คือการหลีกเลี่ยงการทำเงาfindไบนารีที่มาพร้อมกับ OS X


4
+1 gfindนั้นสมบูรณ์แบบเนื่องจากฉันมี symlinks ที่ไม่เสียหาย (เช่น nodeenv) ที่ฉันไม่ต้องการลบ
โหลด

3
วิธีที่จะเอา symlinks เสียก็คือการใช้หามาตรฐาน:find -L ~/.virtualenvs/my-virtual-env/ -type l | xargs rm
vdboor

ฉันลบ virtualenv dir ทั้งหมดของฉัน ตอนนี้ฉันไม่สามารถลบ symlink ได้ โซลูชันที่กล่าวถึงในหน้านี้ไม่ทำงานสำหรับฉันบน mac ฉันยังคงได้รับข้อผิดพลาดเดียวกัน "ไม่พบภาพยกเลิกแทร็ก: 6"
Aseem

ขั้นตอนเหล่านี้ไม่ได้ค่อนข้างทำงานสำหรับฉัน:pip3 freeze dyld: lazy symbol binding failed: Symbol not found: __Py_UnixMain
deed02392

1
เพียงเพิ่มถ้า env อยู่กับ Python 2 ให้รันด้วยอาร์กิวเมนต์: virtualenv ~/.virtualenvs/foo -p python2มิฉะนั้นจะใช้ Python 3
Bohumir Zamecnik

41

หลังจากลองบางสิ่งแล้วสิ่งนี้ใช้ได้ผลกับฉัน:

ไปที่ไดเรกทอรี virtualenv ของคุณ (แต่อย่าเรียกใช้ workon):

cd ~/.virtualenv/name_of_broken_venv

ตอนนี้ลบไฟล์เหล่านี้:

rm -rf .Python bin/python* lib/python2.7/* include/python2.7

จากนั้นเพื่อสร้าง venv ของคุณใหม่ให้เรียกใช้:

virtualenv .
workon name_of_broken_venv
pip freeze

ตอนนี้คุณควรเห็นรายการแพ็คเกจที่ติดตั้งของคุณอีกครั้ง


FWIW ฉันเพิ่งลองวิธีนี้หลังจากอัปเกรดเป็น El Capitan และติดตั้ง homebrew ใหม่และรายการแพคเกจของฉันไม่ได้รับการเก็บรักษาไว้
Ryan

1
กับ pipenv คุณสามารถลบด้วยการทำpipenv --rmและสร้าง, pipenv shell,pipenv install
แฮร์รี่เรโน

14

สิ่งนี้เกิดขึ้นเมื่อฉันอัพเดตเป็น Mac OS X Mavericks จาก Snow Leopard ฉันต้องติดตั้ง Brew ใหม่อีกครั้งด้วย หวังว่าคุณจะรันคำสั่ง freeze สำหรับโปรเจคของคุณด้วย pip

ในการแก้ไขคุณต้องอัปเดตพา ธ ที่สภาพแวดล้อมเสมือนชี้ไป

  • ติดตั้งไพ ธ อนรุ่นหนึ่งด้วย brew:

brew install python

  • ติดตั้ง virtualenvwrapper อีกครั้ง

pip install --upgrade virtualenvwrapper

  • ลบสภาพแวดล้อมเสมือนเก่า:

rmvirtualenv old_project

  • สร้างสภาพแวดล้อมเสมือนใหม่:

mkvirtualenv new_project

  • ทำงานกับสภาพแวดล้อมเสมือนจริงใหม่

workon new_project

  • ใช้ pip เพื่อติดตั้งข้อกำหนดสำหรับโครงการใหม่

pip install -r requirements.txt

นี่ควรออกจากโครงการอย่างที่เคยเป็นมา


เมื่อไม่นานมานี้และฉันเชื่อว่าในที่สุดฉันก็ทำอะไรบางอย่างตามบรรทัดเหล่านี้ แต่เนื่องจากฉันไม่ได้ใช้งาน 'pip freeze> requirements.txt' ตั้งแต่นั้นมาจึงไม่ใช่วิธีที่มีประสิทธิภาพที่สุด บทเรียน.
oxtay

13

@Chris Wedgwoodคำตอบของเวอร์ชันอัปเดตสำหรับการเก็บรักษาsite-packages(ติดตั้งแพ็คเกจไว้)

cd ~/.virtualenv/name_of_broken_venv


mv lib/python2.7/site-packages ./    
rm -rf .Python bin lib include
virtualenv .
rm -rf lib/python2.7/site-packages
mv ./site-packages lib/python2.7/

1
นี่คือสิ่งที่เกินกว่าความสมบูรณ์แบบ ช่วยในการโยกย้ายรุ่นหลามในขณะที่รักษาแพ็คเกจทั้งหมด หากคุณกำลังติดตามสิ่งนี้อยู่อย่าใช้คำสั่งของ @Chris Wedgewood
Harish Prasanna

10

ดูเหมือนว่าวิธีที่เหมาะสมในการแก้ไขปัญหานี้คือการทำงาน

 pip install --upgrade virtualenv

หลังจากที่คุณอัพเกรด Python ด้วย Homebrew

นี่ควรเป็นขั้นตอนทั่วไปสำหรับสูตรใด ๆ ที่ติดตั้งบางอย่างเช่น python ซึ่งมีระบบการจัดการแพ็คเกจของตัวเอง เมื่อคุณติดตั้งbrew install python, คุณติดตั้งpythonและpipและeasy_installและvirtualenvและอื่น ๆ ดังนั้นหากเครื่องมือเหล่านั้นสามารถปรับปรุงตัวเองได้ดีที่สุดที่จะลองทำก่อนที่จะมองหา Homebrew เป็นสาเหตุของปัญหา


สิ่งนี้ใช้ได้กับปัญหาเกี่ยวกับ setuptools โดยเฉพาะ: คำเตือน: ไม่พบตำแหน่ง svn สำหรับ setuptools == 0.6c12dev-r88846
Robert Brisita

1
ฉันใช้โซลูชันนี้ตามด้วยการเรียกใช้: virtualenv . ในสภาพแวดล้อมเสมือนจริงที่ใช้งานไม่ได้ รุ่นที่ปรับปรุงvirtualenvแล้วสร้างการอ้างอิงที่จำเป็นและฉันก็ไปได้ดี กระบวนการนี้จัดการได้ด้วยตนเองและแข็งแกร่งกว่าคำตอบที่ยอมรับสำหรับฉัน
christang

ในปี 2020 นี้ยังคงเป็นคำตอบ
scubabuddha

7

หากครั้งนี้มีสาเหตุมาจากbrew upgradeที่อัพเกรดหลามของตนและคุณ ok อยู่กับการปรับลดกับรุ่นก่อนหน้าให้ลองเช่นbrew switch python [previous version] จากที่นี่.brew switch python 3.6.5


4

คำแนะนำ virtualenvwrapper

ตามที่ระบุไว้ในคำตอบที่ได้รับการยอมรับ, สาเหตุน่าจะเกิดจากการปรับปรุง homebrew นั่นหมายความว่า symlinks virtualenv ของคุณจะชี้ไปที่เส้นทางหลามเสีย - ดูรายละเอียดที่นี่

สำหรับแต่ละ env เสมือนคุณต้องกำหนด symlink ใหม่ให้ชี้ไปที่เส้นทางของหลามที่ถูกต้อง (ในโรงกลั่นเบียร์) นี่คือวิธีการที่จะทำกับvirtualenvwrapper ที่นี่ฉันกำลังอัปเดต env เสมือนจริงที่เรียกว่า "my-example-env"

cd ~/PYTHON_ENVS
find ./my-example-env -type l -delete
mkvirtualenv my-example-env

ทุกอย่างเสร็จเรียบร้อย.


4

ทุกคนที่ใช้pipenv (และคุณควร!) สามารถใช้คำสั่งสองคำสั่งนี้โดยไม่ต้องเปิดใช้งาน venv:

rm -rf `pipenv --venv` # remove the broken venv
pipenv install --dev   # reinstall the venv from pipfile 

1
คุณยังสามารถใช้pipenv --rmในโฟลเดอร์ env ของคุณแล้วpipenv install --dev
Handfeger


2

ฉันเพิ่งเผชิญกับสิ่งนี้ วิธีการแก้ปัญหาข้างต้นไม่ได้ผลสำหรับฉัน ดูเหมือนว่าไม่ใช่ปัญหาของ Python เมื่อฉันเรียกใช้

aws s3 ls

ฉันได้รับข้อผิดพลาดต่อไปนี้:

dyld: Library not loaded: @executable_path/../.Python

หมายความว่าawsไลบรารี่ที่รันได้ชี้ไปยังไม่มีอยู่หรือเสียหายดังนั้นฉันจึงถอนการติดตั้งและติดตั้งใหม่aws-cliตามคำแนะนำจากลิงค์นี้และใช้งานได้ !!


2

ปัญหาสำหรับฉัน (ผู้ใช้ MacOS) คือbrewการปรับปรุงการเชื่อมโยง Python และ virtualenvs ไปเป็นเวอร์ชั่นเก่าซึ่งถูกลบ

เราสามารถตรวจสอบและแก้ไขโดย

>> ls -al ~/.virtualenvs/<your-virtual-env>/.Python
.Python -> /usr/local/Cellar/python/<old-version>/Frameworks/Python.framework/Versions/3.7/Python
>> rm ~/.virtualenvs/<your-virtual-env>/.Python
>> ln -s  /usr/local/Cellar/python/<new-version>/Frameworks/Python.framework/Versions/3.7/Python ~/.virtualenvs/<your-virtual-env>/.Python

นอกจากนี้ยังทำงานเพื่อแก้ไขลิงก์ที่เสียหายหลังจากติดตั้ง Python 3.7 บนระบบที่มี Python3.6
lukik

2

ฉันมีปัญหาที่คล้ายกันและฉันแก้ไขได้โดยเพียงแค่สร้างสภาพแวดล้อมเสมือนใหม่ด้วย virtualenv .


ยินดีต้อนรับสู่ SO แม้ว่าเราจะขอบคุณสำหรับคำตอบของคุณมันจะดีกว่าถ้ามันให้คุณค่าเพิ่มเติมกับคำตอบอื่น ๆ ในกรณีนี้คำตอบของคุณไม่ได้ให้คุณค่าเพิ่มเติมเนื่องจากผู้ใช้รายอื่นโพสต์โซลูชันนั้นแล้ว หากคำตอบก่อนหน้านี้มีประโยชน์กับคุณคุณควรโหวตมันเมื่อคุณมีชื่อเสียง
David Buck

1

ใช้ Python 2.7.10

คำสั่งเดียวvirtualenv path-to-envทำ เอกสาร

$ virtualenv path-to-env
Overwriting path-to-env/lib/python2.7/orig-prefix.txt with new content
New python executable in path-to-env/bin/python2.7
Also creating executable in path-to-env/bin/python
Installing setuptools, pip, wheel...done.

1

ฉันมี env เสมือนที่ใช้งานไม่ได้เนื่องจากติดตั้ง Homebrew ของ python (ดังนั้น symlink ที่ใช้งานไม่ได้) และยังมี "sudo pip install install" บางตัวที่ฉันทำไปก่อนหน้านี้ คำแนะนำของ Weizhong มีประโยชน์มากในการแก้ไขปัญหาโดยไม่ต้องติดตั้งแพคเกจใหม่ ฉันต้องทำสิ่งต่อไปนี้สำหรับปัญหาการอนุญาตแบบผสมด้วย

sudo chown -R my_username lib / python2.7 / site-packages


หากคุณเสริมคำตอบของผู้ใช้คนอื่นคุณควรแสดงความคิดเห็นเพื่อให้พวกเขาสามารถแก้ไขได้! มีส่วนร่วมที่ดี
Francisco Peters

เขามีคะแนนชื่อเสียงไม่เพียงพอที่จะแสดงความคิดเห็นต่อคำตอบ
ไทเลอร์สมิ ธ

1

Virtualenvs ใช้งานไม่ได้ บางครั้งวิธีง่าย ๆ คือการลบโฟลเดอร์ venv และสร้าง virutalenvs ใหม่



1

ฉันกำลังเผชิญกับปัญหาเดียวกันหลังจากอัปเกรด Brew บน OSX Catalina ของฉัน

หลังจากลองสิ่งของหลายชิ้นฉันพบว่าสิ่งต่อไปนี้เป็นทางออกที่ดีและง่ายที่สุด

ตอนแรกให้ลบ env เสมือน (ไม่จำเป็น)

find myvirtualenv -type l -delete

จากนั้นสร้าง virtualenv ใหม่

virtualenv myvirtualenv

การอ้างอิง: https://www.jeremycade.com/python/osx/homebrew/2015/03/02/fixing-virtualenv-after-a-python-upgrade/


0

คำตอบที่ได้รับการยอมรับใช้ไม่ได้สำหรับฉัน: ไฟล์$WORKON_HOME/*/bin/python2.7นี้ไม่ใช่ symlink อีกต่อไป แต่เป็นไฟล์ปฏิบัติการเต็มรูปแบบ:

$ file $WORKON_HOME/*/bin/python2.7
/Users/sds/.virtualenvs/.../bin/python2.7: Mach-O 64-bit executable x86_64
...

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

สำหรับการอ้างอิง:

deactivate
pip install --user virtualenv virtualenvwrapper
pip install --user --upgrade virtualenv virtualenvwrapper
for ve in $(lsvirtualenv -b); do
  # assume that each VE is associated with a project
  # and the project has the requirements.txt file
  project=$(cat $WORKON_HOME/$ve/.project)
  rmvirtualenv $ve
  mkvirtualenv -a $project -r requirements.txt $ve
done

ฉันเดาว่ามันเป็นเพราะวิธีนี้ไม่ได้ล้าสมัย - ฉันได้ลองแล้วและแก้ไขปัญหาของฉัน นอกจากนี้ฉันคิดว่าถ้าคุณไม่มี symlink คุณจะไม่เห็นข้อผิดพลาดที่อธิบายไว้ที่นี่ดังนั้นความคิดเห็นนี้ไม่ใช่วิธีการแก้ปัญหา แต่เป็นสิ่งที่ทำให้ไขว้เขว - เพียงเพราะคุณมีเวอร์ชันที่ใหม่กว่า นั่นคือฉันเดาว่าทำไม downvote :)
RafazZ

@RafazZ: ฉันหวังว่าตอนนี้จะดีขึ้น อย่างไรก็ตามฉันสงสัยว่าทำไมมันยังเป็น symlink สำหรับคุณ และใช่ฉันจะได้รับข้อผิดพลาดนั้นเพราะ virtualenv python เชื่อมโยงกับ libs หลามของหุ้น
sds

ฉันคิดว่าพฤติกรรมเริ่มต้นยังคงสร้าง symlink และคุณต้องการ--always-copyอาร์กิวเมนต์เพื่อลบล้างมัน อย่างน้อยสิ่งที่ฉันได้รับจากคู่มือผู้ใช้
RafazZ

@RafazZ: ฉันไม่เคยใช้--always-copyและฉันมีไฟล์ปกติ :-(
sds


0

ฉันลองใช้วิธีการด้านบนเล็กน้อย แต่พวกเขาก็ไม่ได้ผลสำหรับฉันซึ่งพยายามทำให้สารพิษทำงาน สิ่งที่ทำงานได้ในที่สุดคือ:

sudo pip install tox

แม้ว่าติดตั้งสารพิษแล้ว ผลลัพธ์สิ้นสุดด้วย:

Successfully built filelock
Installing collected packages: py, pluggy, toml, filelock, tox
Successfully installed filelock-3.0.10 pluggy-0.11.0 py-1.8.0 toml-0.10.0 tox-3.9.0

0

สิ่งที่แก้ไขให้ฉันคือเพียงถอนการติดตั้ง python3 และ pipenv จากนั้นทำการติดตั้งใหม่

brew uninstall pipenv
brew uninstall python3
brew install python3 
brew install pipenv

0

คำตอบทั้งหมดดีมากที่นี่ฉันลองใช้วิธีแก้ปัญหาที่กล่าวถึงโดย Ryan, Chris และไม่สามารถแก้ไขปัญหาได้ดังนั้นจึงต้องทำตามวิธีที่รวดเร็วและสกปรก

  1. rm -rf <project dir>(หรือmv <project dir> <backup projct dir>หากคุณต้องการสำรองข้อมูลไว้)
  2. git clone <project git url>
  3. ก้าวต่อไป!

ไม่มีอะไรแปลกใหม่ที่นี่ แต่มันทำให้ชีวิตง่ายขึ้น!


0

ฉันแน่ใจว่าฉันมางานปาร์ตี้ช้า แต่ฉันอยากจะบอกว่าการแก้ปัญหานี้ง่ายกว่าที่กล่าวไว้ที่นี่

คุณสามารถสร้างสภาพแวดล้อมเสมือนจริงได้อย่างง่ายดายโดยไม่ต้องลบ / แก้ไขอะไรเลย สมมติว่าสภาพแวดล้อมที่แตกของคุณถูกเรียกว่าenv_to_fixคุณสามารถทำสิ่งต่อไปนี้ได้:

mkvirtualenv env_to_fix

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


0

ฉันเจอปัญหาเดียวกันเมื่อฉันชี้ python ของฉันเวลารันจาก 2 ถึง 3 บน mac ของฉันชี้ alias python ไปยังเส้นทาง python 3 จากนั้นฉันจะสร้าง virtualenv ใหม่และติดตั้งแพคเกจเหล่านั้นอีกครั้งที่ฉันต้องการสำหรับโครงการของฉัน สำหรับกรณีการใช้งานของฉันฉันมีโปรแกรมหลามเขียนถึง google แผ่น ทำความสะอาดแพ็กเกจบางอย่างที่แตกต่างจากการใช้งาน python 2 และต่างก็เริ่มทำงานอีกครั้ง

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