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 21:06에

2
예, 그렇습니다. 가상 환경을 복구하지만 문제를 해결하지는 못합니다.
Florian

2019 년 11 월, Python3. 나를 위해 가장 좋은 방법은의 설명이다 aarongorka.com/blog/portable-virtualenv
사미르 SADEK

답변:


148

상대 경로를 사용하도록 설치를 조정해야합니다. virtualenv--relocatable옵션을 제공합니다 . 에서 워드 프로세서 :

일반적으로 환경은 특정 경로와 연결되어 있습니다. 즉, 환경을 이동하거나 다른 컴퓨터로 복사 할 수 없습니다. 다음 명령으로 환경을 재배치 할 수 있도록 환경을 수정할 수 있습니다.

$ virtualenv-연관 가능한 ENV

참고 : ENV는 가상 환경의 이름이며 ENV 디렉토리 외부에서 실행해야합니다.

이것은 setuptools에 의해 생성 된 파일 중 일부를 만들거나 상대 경로를 사용하고 Python 인터프리터의 위치를 ​​사용하여 환경을 선택하는 대신 activate_this.py를 사용하도록 모든 스크립트를 변경합니다.

참고 : 환경에 패키지를 설치 한 후에는이를 실행해야합니다. 환경을 재배치 할 수있게하고 새 패키지를 설치 한 경우 virtualenv --relocatable을 다시 실행해야합니다.


2
경고 : env를 재배치 가능으로 변경하면 폴더를 이동시키는 것 이상의 효과가 있습니다. ( 참고 : 문서에서 복사 한 참조 ) ... 부작용이있을 수 있습니다.
벤 로버츠

7
--relocatable 옵션은 현재 여러 가지 문제가 있으며 모든 상황에서 작동하지 않을 수도 있습니다. 향후 버전의 virtualenv에서는이 옵션이 더 이상 사용되지 않을 수 있습니다. 또한 이것은 패키지를 크로스 플랫폼으로 만들지 않습니다. 디렉토리를 이동할 수 있지만 다른 유사한 컴퓨터에서만 사용할 수 있습니다.
Demz

1
@TheDemz grep -EIr '\Wold_venv_name\W' /path/to/new_venv는 이전 venv를 사용하는 shabang을 찾는 데 도움이되지만 재배치 된 venv의 완전한 검증은 아닙니다.
호브

2
또한 .projectvirutalenvwrapper를 사용하고 새 virtualenv와 일치하도록 프로젝트 디렉토리의 이름을 바꾼 것으로 가정하면 virtualenv에 종속되는 소스 코드에 대한 경로가 포함 된 virtualenvwrapper 파일 을 편집해야합니다 .
호브

이것을 실행하기 전에 virtualenv를 비활성화해야했습니다.
antonagestam

108

나는 "왜 아는 것"이 ​​"어떻게 아는 것"보다 중요 하다고 생각 합니다 . 이 문제를 해결하는 또 다른 방법이 있습니다.

를 실행 . env/bin/activate하면 실제로 다음 명령을 실행합니다 ( /tmp예 : 사용 ).

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

그러나 방금 이름 myproject을 로 변경 하여 project해당 명령을 실행하지 못했습니다. 이것이 시스템 글로벌 환경에 pip is not installed설치 되지 않았고 pipvirtualenv pip가 올바르게 소스 되지 않았기 때문에 이라고 말하는 이유 입니다.

이 문제를 수동으로 수정하려면 다음과 같이하십시오.

  1. Vim과 같은 자주 사용하는 편집기를 사용하여 /tmp/project/env/bin/activate일반적으로 42 행에서 수정하십시오 .

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

  2. /tmp/project/env/bin/pip1 행에서 수정하십시오 .

    #!/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

이것은 나에게 많은 도움이되었습니다. 왜 그런지 알아야 했어요 ... 고마워요!
자비스

위의 Keven의 의견과 달리이 두 줄을 편집하면 움직이는 것과 관련된 모든 문제가 해결됩니다 virtualenv. 아마도 사용하지 않는 문제가있을 수 있으므로 문제가 발생하지 않습니다.
Deleet

긁어! 오늘 나는 문제가 발생했습니다 : ipython은에서 작동하지 않습니다 virtualenv. 이 문제를 해결하기 위해 ipython파일 에서 bash 헤더 (이것은 무엇입니까?)를 편집 한 다음 정상적으로 작동했습니다.
Deleet

흠, 이것은 나를 위해 작동하지 않으며, 내 활성화 스크립트에 2 단계에서 언급 된 라인 1이없는 것 같습니다.
Evan Zamir

40

참고 : @jb로. 이 솔루션은 쉽게 (재) 만들어진 것에 만 적용됩니다 virtualenv. 환경에이 솔루션을 설치하는 데 몇 시간이 걸리는 경우 권장하지 않습니다


Virtualenvs는 쉽게 만들고 전환 할 수 있기 때문에 훌륭합니다. 단일 구성으로 고정되지 않습니다. 프로젝트 요구 사항을 알고 있거나 얻을 수 있는 경우 새로 작성하십시오virtualenv .

  • requirements.txt파일 만들기

    (env)$ pip freeze > requirements.txt

    • requirements.txt파일을 만들 수 없으면 env/lib/pythonX.X/site-packages원본을 제거하기 전에 확인하십시오 env.
  • 기존 삭제 (env)

    deactivate && rm -rf env

  • 새로 만들기 virtualenv, 활성화 및 설치 요구 사항

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


또는 virtualenvwrapper를 사용하여 모든 virtualenv가 중앙 위치에 유지되므로 작업이 조금 더 쉽습니다.

$(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- 확장 프로그램 컴파일).
jb.

4
아마도 사실이지만, 그것은 나에게 엣지 케이스처럼 보입니다. 나는 이것이 이것이 많은 경우에 가능한 해결책이라고 생각합니다.
bnjmn

Yah, 많은 프로젝트 (예 : Django 웹 사이트)는 수십 개의 종속성이있는 경우에도 모든 것을 설치하는 데 30 초 밖에 걸리지 않습니다 (모든 것을 먼저 다운로드하고 '--no-index --find-links = downloadDir'사용) )
Jonathan Hartley

1
@bnjmn 원 라이너 virtualenv env && pip install -r requirements.txt는 새 환경에서 요구 사항을 활성화하지 않기 때문에 요구 사항을 설치하지 않습니다
Yarin

1
@Yarin 지적 해 주셔서 감사합니다. 나는 virtualenv-wrapper사용자 자신이 (생성시 자동 활성화 되는) 완전히 놓쳤다 . virtualenv혼란을 피하기 위해 활성화를 포함하도록 답변을 업데이트했습니다 .
bnjmn

28

나는 항상 virtualenvwrapper를 설치하여 도움을줍니다. 쉘 프롬프트에서 :

pip install virtualenvwrapper

virtualenvwrapper 문서에 문서화 된 방법이 있습니다 -cpvirtualenv 이것이 당신이하는 일입니다. 사용자 환경이 아닌지 확인하고 쉘 프롬프트로 돌아가십시오. 필요한 이름으로 이것을 입력하십시오.

cpvirtualenv oldenv newenv

그리고 필요한 경우 :

rmvirtualenv oldenv

당신의 새로운 환경으로 가려면 :

workon newenv

1
Afrowave의 대답은 실제로 허용되는 방법이어야합니다.
Jaxian

이것 만이 virtualenvwrapper아닌, 하나를 사용하는 경우에만 작동합니다 virtualenv. @ ryankdwyer의 대답 이 더 좋습니다.
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 2019

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' *macs
Alex

1

virtualenv --relocatable ENV바람직한 해결책은 아닙니다. 나는 대부분의 사람들이 장기적인 부작용 없이 virtualenv의 이름을 바꾸는 기능을 원한다고 가정 합니다.

이를 위해 간단한 도구를 만들었습니다. virtualenv-mv 의 프로젝트 페이지 는 좀 더 자세하게 설명하지만 기본적 virtualenv-mv으로 간단한 구현 mv(옵션없이)을 사용하는 것처럼 사용할 수 있습니다 .

예를 들면 다음과 같습니다.

virtualenv-mv myproject project

그러나 나는 이것을 해킹했다는 점에 유의하십시오. 비정상적인 상황 (예 : 심볼릭 된 virtualenvs)에서 중단 될 수 있으므로주의하십시오 (손실 할 수없는 것을 백업). 문제가 발생하면 알려주십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.