가상 환경을 갖춘 프로젝트가 있습니다. 내 프로젝트 구조는 다음과 같습니다
$ cd /path/to/project
$ tree . -L 2
.
├── venv
│ ├── bin
│ ├── include
│ ├── lib
│ ├── lib64 -> lib
│ ├── pip-selfcheck.json
│ └── pyvenv.cfg
├── py -> /path/to/project/venv/bin/python3
├── README.md
├── req.txt
└── source
└── sym.py
프로젝트 트리에 스크립트가 있는데 가상 환경을 활성화하지 않고 프로젝트 트리에서 이 스크립트를 실행하고 싶습니다. py
Venv에서 Python 실행 파일의 실제 위치를 가리키는 심볼릭 링크가 있습니다 . 이는 내 Python 실행 파일이 스크립트에 하드코딩되지 않고 shebang을 포함하는 동안 어디든 빠르게 배포될 수 있도록 하기 위한 것입니다.
py
이제 실제 Python 실행 파일로 심볼릭 링크를 호출하면 /path/to/project/venv/bin/python3
작동하지 않습니다(자세한 내용은 아래 참조). 내가 알아차린 동반 증상은 sys.path
값이 변경되었다는 것입니다. 폴더에서 다음 명령을 실행합니다 /path/to/project/source/
.
$ ls -l ../py
lrwxrwxrwx. 1 som cms-script-admins 45 Apr 17 19:39 ../py -> /path/to/project/venv/bin/python3
$ cat sym.py
import sys
print(sys.path)
$ ../py sym.py
['/path/to/project/source', '/usr/lib64/python36.zip', '/usr/lib64/python3.6', '/usr/lib64/python3.6/lib-dynload', '/usr/local/lib64/python3.6/site-packages', '/usr/lib64/python3.6/site-packages', '/usr/lib/python3.6/site-packages']
$ /path/to/project/venv/bin/python3 sym.py
['/path/to/project/source', '/usr/lib64/python36.zip', '/usr/lib64/python3.6', '/usr/lib64/python3.6/lib-dynload', '/path/to/project/venv/lib64/python3.6/site-packages', '/path/to/project/venv/lib/python3.6/site-packages']
[비교를 용이하게 하려면 출력의 마지막 줄에 공백을 추가하십시오. ]
보시다시피, 심볼릭 링크를 실행하는지 아니면 직접 실행을 호출하는지에 따라 시스템 경로가 변경됩니다.
예를 들어, 심볼릭 링크에는 가 포함되어 있지만 /usr/lib/python3.6/site-packages
venv의 실제 실행 파일에는 /path/to/project/venv/lib/python3.6/site-packages
.
문제의 예: 셀레늄을 가져오려고 하면 다음과 같은 결과가 나타납니다.
$ ../py
>>> import selenium
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'selenium'
어떻게 해결할 수 있나요?