Python exec와 python exec에 대한 심볼릭 링크의 시스템 경로는 다릅니다. 이로 인해 ModuleNotFoundError가 발생합니다.

Python exec와 python exec에 대한 심볼릭 링크의 시스템 경로는 다릅니다. 이로 인해 ModuleNotFoundError가 발생합니다.

가상 환경을 갖춘 프로젝트가 있습니다. 내 프로젝트 구조는 다음과 같습니다

$ 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

프로젝트 트리에 스크립트가 있는데 가상 환경을 활성화하지 않고 프로젝트 트리에서 이 스크립트를 실행하고 싶습니다. pyVenv에서 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-packagesvenv의 실제 실행 파일에는 /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'

어떻게 해결할 수 있나요?

관련 정보