귀하의 문제 (복사 귀하의 코멘트) 여기에 있습니다 : 내가 sudo는을 사용하여 실행중인
@georgexsh. 기본적으로 sudo를 사용하면 시스템 파이썬이 사용됩니다. 그래서, "sudo venv/bin/python main.py"를 사용하여 프로그램을 실행했습니다. 여기 venv의 python을 사용하고 있지만 "os.system ('python')"에 대해 "/ usr/bin/python"을 반환합니다. do not do 이 동작을 이해하십시오.
기본적으로 여기서 설명하는 것은 virtualenv가 활성화되지 않은 것입니다.
virtualenv (. venv/bin/activate)
을 활성화하면 활성화 스크립트는 PYTHONPATH
이 정확하고 가상 env 디렉토리에서 Python 실행 파일이 검색 (및 검색)되도록 환경을 변경합니다. 이것은 virtualenv가하는 것입니다.
virtualenv 디렉토리에서 파이썬 바이너리를 실행하기 만하면 가상 환경에 대한 환경이 설정되지 않으므로 이후의 모든 파이썬 호출에 기본 경로가 사용됩니다.
sudo를 실행하면 새 프로세스/셸이 만들어지고 가상 환경이 상속되지 않습니다. sudo -E
을 사용하여 환경을 넘길 수도 있지만 sudo에 따라 다릅니다. 모든 환경에서 작동해야하는 방탄 버전은 virtualenv를 먼저 활성화 한 다음 스크립트를 실행하는 셸을 실행하는 것입니다.이런 식으로 뭔가 :이 루트로 bash 쉘을 실행
sudo -- bash -c ". /home/test/mytest/bin/activate; which python"
후 가상 환경을 활성화하고 결국 사용 파이썬을 알려줍니다. 가상 환경 경로로 위의 명령을 수정하면 작동 할 수도 있습니다.
시스템을 공유하는 경우 일반 사용자가 보안 관점에서 허용하는 것이 끔찍한 일임을 명심하십시오. 이렇게하기 위해 일반 사용자를 위해 암호가없는 sudo를 만들면 약간의 조정만으로 루트 액세스 권한을 얻을 수 있습니다. 자신의 시스템이고 요구 사항이 어쨌든 루트 암호를 알고 있다면 중요하지 않습니다.
부모 프로세스가 virtualenv python으로 시작 했습니까? – georgexsh
@georgexsh 예입니다. 실제로 이러한 기능은 플라스크 앱의 일부입니다. – Kumaran
나는 위의 프로그램의 고정 된 버전을 테스트했다. (예를 들어 Process 매개 변수는'func2()'가 아니고'func2'와 다른 수정이있다.) 실제로 virtualenv 버전을 반환한다. 프로세스를 생성하기 직전에'os.system ("python") "을 주 프로그램에 추가하고 거기에서 무슨 일이 일어나는지보십시오. – Hannu