virtualenv를 이동할 수 있습니까?


89

이 질문은 중복되지 않습니다.

가상 환경의 이름바꾸는 것뿐만 아니라 실제로 다른 사용자의 디렉터리를 포함하여 다른 디렉터리 로 실제로 이동 하는 것과 관련이 있습니다.

이것은 단순히 가상 환경, 특히 virtualenv에 익숙하지 않은 사람들의 이름을 바꾸는 것과는 다릅니다.

virtualenv를 만들고 다른 폴더로 이동해도 여전히 작동합니까?

$ virtualenv -p /usr/bin/python3 /home/me/Env/my-python-venv
$ source Env/my-python-venv/bin/activate
(my-python-venv) $ 

... 그날 이후에 가상 환경이 이동했습니다 ...

(my-python-venv) $ deactivate
$ mkdir -p /home/me/PeskyPartyPEnvs
$ mv /home/me/Env/my-python-venv /home/me/PeskyPartyPEnvs/

질문:

작동할까요?

$ source /home/me/PeskyPartyPEnvs/my-python-venv/bin/activate
(my-python-venv) $ /home/me/PeskyPartyPEnvs/my-python-venv/bin/pip3 install foaas

나는 이것을 시도하는 지혜에 대한 질문이 아니라 (물론 지혜가 유머러스하지 않는 한) 그것이 가능한지에 대해 더 많이 의미합니다. 파이썬 3에서 할 수 있는지, 아니면 그냥 빨아서 복제 해야하는지 정말 알고 싶습니다 .

수 나는 단지 슬픔이없는 그런? 나는 슬픔을 피하고 싶다.mvvirtualenv

답변:


69

예. 동일한 플랫폼에서 이동할 수 있습니다. 당신이 사용할 수있는--relocatable기존 환경에서 .

에서 --help:

--relocatable-기존 virtualenv 환경을 재배치 가능하게 만듭니다. 이것은 스크립트를 수정하고 모든 .pth 파일을 상대적으로 만듭니다.

그러나 이것은 activate스크립트 를 변경하는 것처럼 보이지 않으며 오히려 pip*easy_install*스크립트 만 변경합니다 . 에서 activate스크립트의 $VIRTUAL_ENV환경 변수는 원본과 하드 코딩 /path/to/original/venv. $VIRTUAL_ENV변수가 설정하는 데 사용되는 PATH이 새로운 위치에 따라 변경해야합니다 그래서 전화를하기 위해 너무 활성 환경을 pythonpip 등 절대 경로없이.

이 문제를 해결하기 위해 스크립트 $VIRTUAL_ENV에서 환경 변수를 변경할 수 있습니다 activate(예 :sed ). 모든 것이 잘되어야합니다.

사용 예 :

$ cd ~/first
$ virtualenv my-venv
$ grep 'VIRTUAL_ENV=' my-venv/bin/activate
VIRTUAL_ENV="/home/username/first/my-venv"
$ virtualenv --relocatable my-venv
Making script my-venv/bin/easy_install relative
Making script my-venv/bin/easy_install-2.7 relative
Making script my-venv/bin/pip relative
Making script my-venv/bin/pip2 relative
Making script my-venv/bin/pip2.7 relative
### Note that `activate` has not been touched
$ mkdir ~/second
$ mv my-venv ~/second
$ cd ~/second
$ grep 'VIRTUAL_ENV=' my-venv/bin/activate
VIRTUAL_ENV=/home/username/first/my-venv
### (This variable hasn't been changed, it still refers to the old, now non-existent directory!)
$ sed -i -e 's|username/first|username/second|' my-venv/bin/activate
## sed can be used to change the path.
## Note that the `-i` (in place) flag won't work on all machines. 
$ source my-venv/bin/activate 
(my-venv) $ pip install foass
...
(my-venv) $ python 
[...]
> import foass

만세, 이제 사물을 설치하고 새로 배치 된 가상 환경에로드 할 수 있습니다.


//, 흠. 이것은 실제로 이들을 재배치 가능하게 만드는 것으로 끝나지 않는 것 같습니다. "정상적인"스크립트 파일이 아니라는 오류가 계속 발생합니다.
Nathan Basanese 2015 년

7
"--relocatable 옵션은 현재 여러 가지 문제가 있으며 모든 상황에서 작동하는 것이 보장되지는 않습니다. 이 옵션은 향후 버전의 virtualenv에서 더 이상 사용되지 않을 수 있습니다. "(강조) 사용자 가이드
BobTuckerman 참조

1
나는 Windows에서 이것을 시도했고 오류는 모든 스크립트 (* .py, * .bat, * .ps1)를 Scriptsdir ( bin* nix 와 동일 )에 나열하고 activate.ps1 cannot be made relative (it's not a normal script that starts with #!c:\..python.exe.기본적으로 파일의 해시 뱅이 불평 하고 있다고 말합니다. header는 현재 virtualenv의 python.exe가 아니며, -easy fixed에서 옮긴 것입니다. 나는 그 호화로운 스크립트를 살펴 보았고 어쨌든 이미 자신의 경로를 발견했습니다. 다른 스크립트 중 일부는 경로 (예 : deactivate.bat)에 의존하지 않으므로 간단히 말해서 작동합니다.
Davos

2
@NathanBasanese activate.ps1 cannot be made relative해당 스크립트는 이미 상대적이므로 메시지 를 무시할 수 있습니다. 이 메시지는 Windows에서는 유용하지 않습니다. 스크립트는 #!Linux에서와 같이 명령을 사용 하여 어떤 응용 프로그램을 실행해야하는지 셸에 알리지 않기 때문입니다. 는 activate.bat수정되지 않지만 (전화, 적어도 윈도우 10에 사용되지되지 activate그래서 내가 편집에 모든 스크립트를 필요로하지 않았다 출시에게 포쉬 스크립트). 문제는 pip.exe하드 코딩 된 python 경로가 있고 16 진 편집기로 편집하거나 다시 설치해야한다는 것입니다.
Davos

3
@Sgedda 돌이켜 보면 나는 이것을하지 말라고 말할 것입니다. 파이썬 환경은 최소한 pip freeze요구 사항 파일을 사용하여 쉽게 다시 만들 수 있어야 모든 패키지, 도커 (virtualenv가 설치된 상태에서 잘 작동), conda, pyenv 또는 기타 도구를 쉽게 다시 설치할 수 있습니다. 불변의 인프라로 환경을 만들고 파괴 할 수 있어야합니다. 소중해서는 안됩니다.
Davos

15

Python 3.3 이상 (새로운 venv 내장 모듈 포함)

단답형 (버전에 관계 없음) :

  • 가상 환경을 이동하는 깔끔하고 직접적인 방법은 없습니다.
  • 그냥 재창조, 쉽습니다 !!


긴 답변 :

Python v3.3부터는 virtualenv이름이 내장 된 모듈이되었습니다.venv .

--relocatable다른 답변에서 언급 된 옵션에 포함되지 않은 venv, 현재 좋은, 나도 이름을 변경하려면 알고 있어요 또는 파이썬 가상 환경을 재배치하는 것이 안전한 방법이 없습니다.

그러나 현재 설치된 모든 패키지를 사용하여 가상 환경을 간단하게 다시 만드는 매우 간단한 방법이 있습니다. 이 답변을 참조 하거나 가상 환경 재생성에 대한 정보는 아래 섹션을 참조하십시오. 프로세스 중에 원하는 위치와 이름으로 새 환경을 다시 만들 수 있습니다. 또는 프로세스는 아래 섹션을 참조하십시오.

그 대답에서 그는 직접 이름 변경이나 이동을 지원할 수있는 몇 가지 타사 패키지를 언급합니다. 가상 환경을 그대로 이동하는 방법을 추구하는 데 만족한다면venv 에서도 있습니다.

참고 : 그 대답에서,이에 집중 virtualenv하기보다는 venv. 번역 방법은 아래를 참조하세요.



venv이전 virtualenv명령 구문 과 비교

사용할 명령 venv은 다음과 같습니다.

python -m venv

대신 virtualenv원래 패키지에 명령으로 설치됩니다. 그러나 "python"은 파이썬 실행 파일을 실행하는 것을 의미하며, 다음과 같은 다양한 것일 수 있습니다.

  1. python
  2. py또는 py -3.7유사 ( Windows 용 Python Launcher 3.3 이상 및 Windows 용 )
  3. python3 (Python 2 및 3을 이중 설치하는 Linux 환경에 대한 규칙)
  4. 문제가있는 경우 실행하려는 python 실행 파일의 절대 경로를 사용하십시오. 예 : c:\program files\python37\python.exe

실행중인 버전이 확실하지 않은 경우 언제든지 확인할 수 있습니다 python --version.



가상 환경을 다시 만드는 방법

가상 환경을 생성 / 재창조하는 것은 쉬우 며 잠시 작업 한 후에는 자연 스러워야합니다. 이 프로세스는 전반에 스크립트를 패키지 (종속성 포함)로 배포하기 위해 수행 할 작업과 추가 개발을 위해 스크립트 / 패키지를 설치하기 위해 수행 할 작업을 반영합니다.

먼저 가상 환경에있는 항목의 업데이트 된 목록을 가져옵니다. 활성화 된 상태에서 사용하는 Python 버전을 가져오고 종속성 목록을 파일에 저장합니다.

  1. python --version활성화 된 가상 환경과 함께 사용 하여 사용중인 Python 버전을 확인합니다.

    • 이는 명확성을위한 것입니다. 다양한 이유로 Python 버전을 최소한 최신 패치 버전으로 업데이트 할 수 있습니다.
    • 예를 들어 기존 venv가 Python v3.7.4를 사용하고 있지만 지금은 v3.7.6이 나오지 않는 경우-대신 v3.7.6을 사용하십시오. 여기에는 비파괴 보안 및 버그 수정 만 포함되어야합니다.
  2. 사용하여 python -m pip freeze > requirements.txt현재 패키지 종속성의 목록을 작성하고에 넣어 requirements.txt파일. 이 명령은 Linux 또는 Git Bash에서 확실히 작동합니다. Windows의 Powershell 또는 명령 줄에 대해 100 % 확신하지는 않습니다.

이제 새 가상 환경을 만든 다음 이전 환경의 종속성을 추가합니다.

  1. 새로운 venv를 만드십시오.

    • venv에 설치하려는 올바른 버전의 Python을 사용하고 있는지 확인하십시오.
    • 정확히 동일한 Python 버전을 원하면 :
      • 현재 가상 환경 (활성화 된 상태)에서 직접 Python을 실행 python하고 명령으로 사용 하십시오.
      • 또는 python.exe가상 환경 폴더에서 절대 경로를 사용하십시오.
    • 명령의 새 venv 폴더 항목의 경우 :
      • 원하는 최종 폴더 위치에 절대 또는 상대 경로를 추가하십시오.
      • python -m venv my_new_venvmy_new_venv폴더 의 현재 작업 디렉터리에 새 가상 환경을 만드는 데 사용 합니다.
      • venv 폴더의 이름은 venv의 이름이됩니다 (활성화 될 때 프롬프트에 표시되는 내용).
  2. requirements.txt파일 에서 종속성을 설치하십시오 .

    • python -m pip install -r requirements.txt

개발 모드에있는 로컬 패키지를 다시 설치해야 할 수 있습니다.

패키지가 설치된 특정 위치를 확인해야하는 경우 다음을 사용하십시오.

  • python -m pip list -v
  • -v또는 "상세"옵션이 설치되어있는 경로를 포함하여 설치된 각 패키지에 대한 몇 가지 추가 정보를 추가 할 것입니다. 이것은 바로 당신이 유지 가상, 사용자 및 시스템 설치 패키지를 만들 때 유용합니다.

이 시점에서 이전 venv 폴더와 모든 내용을 삭제할 수 있습니다. 이를 위해 GUI를 사용하는 것이 좋습니다. 파일 삭제는 종종 Linux 명령 줄에서 영구적이며 작은 오타는 나쁜 소식이 될 수 있습니다.


즉, pip로 모든 라이브러리를 다시 다운로드 할 필요없이 venv pip 상태 를 복사 할 방법이 없습니까?
Aydo

나는 당신이 원하는 이유를 잘 모르겠습니다. 인터넷에 대한 대역폭이 매우 낮은 상황 때문입니까, 아니면 많은 복제가 필요합니까? pypi에서 모든 zip을 가져 와서 로컬로 설치할 수 있다고 생각하지만 이에 대해 최신 정보는 아닙니다. 패키지를 호스팅하기 위해 로컬 pip 서버를 설정할 수 있다는 것을 알고 있습니다.
LightCC

문제는 (해결하려고하는) 네트워크 트래픽이 pip (또는 거의 모든 곳)에 허용되지 않는 컴퓨터에서 Python 스크립트를 실행하고 싶다는 것입니다. 파일을 넣을 수는 있지만 pip와 대화 할 수 없습니다. 확실히 틈새 시장이지만 정확히 내가 이러한 것들을 옮겨야하는 이유입니다.
Richard Rast

@RichardRast 그것은 다른 문제입니다, 나는 단지 원래 질문에 대답하고 있습니다. 참고 : 문제에 대한 해결책이 있습니다 (zip으로 패키지 다운로드 및 로컬 설치, 방화벽 뒤에서 PyPi 미러 서버 실행 등). 이것은 옳지 않습니다. : Q & A ..
LightCC

2
모든 패키지에서 바퀴를 pip wheel . -w wheels만든 다음 새 가상 환경에 패키지를 다시 설치할 수 있습니다.pip install --no-index --find-links /path/to/wheels/ -r requirements.txt
np8

7

이 작업을 수행 할 수 있는 --relocatable인수가 virtualenv나타납니다.


//, 이것은 단지 상대 경로에 의존합니까, 아니면 어떤 식 으로든 주위에 원숭이입니까?
Nathan Basanese 2015 년

1
--relocatable은 기존 가상 환경에서만 작동합니다. virtualenv --relocatable my-python-venv환경이 이미 존재하면 실행하십시오 .
hilcharge

1
보낸 사람 --help: This fixes up scripts and makes all .pth files relative. 아니 그것은 플랫폼 독립적 인 라이브러리를 만들지 않을 것입니다. 다른 플랫폼으로 옮기고 싶다면 로컬 파이썬을 기반으로 다시 설치해야합니다.
hilcharge

5
python3의 venv 모듈은이 플래그를 지원하지 않습니다
넬슨

7

그러나 ALAS :

아니요, 단순히 mv. 해결 방법이 있지만 다시 설치하는 것이 더 쉬울 수 있습니다.

(my-python-venv)$ /home/me/PeskyPartyPEnvs/pip3 install foaas
zsh: /home/me/PeskyPartyPEnvs/pip3: bad interpreter: /home/me/Env/my-python-venv/bin/python3: no such file or directory
(my-python-venv)$ deactivate
$ 

... enter좌절감이 많이 들며 다음 작품

$
$
$ pip3 search foaas

제외하고는 my-python-venv ergo 슬픔입니다.

원하십니까 mv당신의virtualenv , 그렇지 않으면 수정되지 않은, 그리고 그것을 사용?

짧은 답변:

나는 Boromir가 그것을 말하게 할 것입니다.

글쎄, 당신 은 할 수 없습니다 .


2
삐걱 거리고 적절하게 수정하고 싶지 않은 한 : 이동 문제를 일으키는 것은 bin의 바이너리에있는 링크입니다. 어디에서 왔는지 안다면 find bin -type f -exec ex -sc "%s,${FROM},${PWD},g|x" {} \;bin과 lib가 현재 venv 폴더에 있다고 가정 하는 것과 같은 것을 사용할 수 있습니다 . 나는 이것을 많은 pip 패키지가 설치된 python3 가상 환경을 복사하고 이동하는 빠르고 더러운 방법으로 사용합니다.
Paul Whipp

1
@PaulWhipp 그 명령을 사용하는 것보다 사용하는 것의 이점이 --relocatable있습니까? 또한 Nathan, 좋은 질문이지만 이것은 끔찍한 대답입니다. 자신의 대답을 받아들이는 것은 잘 작성되어 있고 옵션을 명확하게 열거하지 않는 한 항상 약간 편향되어 있지만 어쨌든 자신이 주관적이라고 결정합니다.
다 보스

1
@Davos --relocatable은 나를 위해 작동하지 않았지만 바이너리를 해킹하여 python3 venvs를 일상적으로 이동했으며 지금까지 아무런 문제가 없었습니다.
Paul Whipp

1
나는 당신이 다른 (즉, 당신의 것이 아닌) 대답으로 받아 들여 져야한다고 암시하고 있었다. 아마도 사람들이 선택한 대답 일 것이다. : D
Davos

3
질문은 "단순히 mvVenv가 될 수 있습니까?"였고 대답은 "아니요 단순히 할 수 없습니다. mv해결 방법이 있지만 다시 설치하는 것이 더 쉬울 수 있습니다."입니다. 이것이 최고의 답변이라면 나와 다른 사람들이 시간을 절약 할 수있을 것입니다.
Nickolay

5

예, virtualenv의 현재 디렉토리에 의존하는 작업을 수행하지 않은 경우 가능합니다.

그러나 선택할 수있는 경우 가장 좋은 방법은 새 virtualenv를 만들고 대신 새 virtualenv를 사용하는 것입니다. 이것은 가장 안전한 선택이며 나중에 문제를 일으킬 가능성이 가장 적습니다.

문서 에는 다음과 같이 언급되어 있습니다 .

각 virtualenv에는 하드 코딩 된 경로 정보가 있습니다.

예를 들어 실행 setvirtualenvproject한 경우 실행 한 후 올바른 디렉터리로 전환 할 workon ...수 없으므로이 경우 수동으로 수정해야합니다.

일반적으로 virtualenv는 필요한 Python 인터프리터 파일과 필요한 패키지가있는 디렉토리에 불과합니다.


2

이에 대한 답변과 유사한 주제에 대한 다른 스레드를 사용 하여 virtualenv 디렉토리 자체에서 찾아서 실행하는 bash 스크립트를 만들었습니다.이 스크립트는 virtualenv 이동에 도움이됩니다.

수행 한 후 virtualenv --relocatable yourenv당신이 당신의 변경해야합니다 VIRTUAL_ENV수동으로 변경 wan't하지 않도록 경우, 변수는 디렉토리를 이동할 때마다,이를 사용합니다.

#!/bin/bash \n 
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
EXISTING=$(grep 'VIRTUAL_ENV=' bin/activate)  
NEWDIR=VIRTUAL_ENV=\"$DIR\"
sed -i -e "s|$EXISTING|$NEWDIR|" bin/activate
source bin/activate

도움이되기를 바랍니다.


0

그래 넌 할수있어! (에windows )

해결 방법은 간단합니다. 가상 환경을 어디로 든 이동 한 다음 activate.bat내부에서 편집하면 됩니다 scripts\.

  1. 가상 환경에서 원하는 디렉토리로 이동

  2. 마우스 오른쪽 버튼으로 클릭하고 편집 activate.bat에 있습니다 venv_folder\scripts.

  3. 다음 VIRTUAL_ENV에서 변수 변경 :

     set VIRTUAL_ENV=C:\old_directory\venv_name
    

    으로

     set VIRTUAL_ENV=C:\new_directory\venv_name
    
  4. 편집 한 배치 파일을 저장하면 끝입니다!

참고 : 내 솔루션이 작동하고 windows users새 가상 환경 설정을 저장해야 합니다. 다른 운영 체제에서도 작동하지 않을 것 .bat입니다.MS-DOS


변경 old_directory하려면 old_directory- 오타이다?
ACK

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