2017-10-27 11 views
0

나는 virtualenv를 사용하여 프로그램을 실행 중이다. 하지만 여기에서 생성 된 다중 처리는 기본적으로 시스템 파이썬을 사용합니다. virtualenv python을 사용하려면 어떻게해야합니까?파이썬 다중 처리. virtualenv를 사용하는 프로세스

import os 
from multiprocessing import Process 

def function1(): 
    # do_something_here 
    p = Process(func2(), args=(param,)) 
    p.start() 
    return something 

def func2(param): 
    os.system("which python") 

여기에 "/ usr/bin/python"이 인쇄됩니다. 하지만 대신 virtualenv python을 사용해야합니다.

+0

부모 프로세스가 virtualenv python으로 시작 했습니까? – georgexsh

+0

@georgexsh 예입니다. 실제로 이러한 기능은 플라스크 앱의 일부입니다. – Kumaran

+1

나는 위의 프로그램의 고정 된 버전을 테스트했다. (예를 들어 Process 매개 변수는'func2()'가 아니고'func2'와 다른 수정이있다.) 실제로 virtualenv 버전을 반환한다. 프로세스를 생성하기 직전에'os.system ("python") "을 주 프로그램에 추가하고 거기에서 무슨 일이 일어나는지보십시오. – Hannu

답변

2

sudo venv/bin/python을 사용하면 effectively activated virtualenv에서 virtualenv에서 직접 실행 가능한 python을 사용합니다.

multiprocessing.Processfork()이없는 자식 프로세스는 exec()이 아니며 부모 프로세스와 동일한 python 실행 파일을 사용합니다. 파이썬 실행 파일 경로를 실행 결정 which를 사용하지 마십시오

>>> import sys 
>>> print(sys.executable) 
/Users/georgexsh/workspace/tmp/venv/bin/python 
>>> print(sys.exec_prefix) 
/Users/georgexsh/workspace/tmp/venv/bin/.. 

: 당신은에 의해 사용중인 파이썬 실행 파일을 확인할 수

. which은 Bash 명령으로 $PATH의 각 요소에서 "python"이라는 실행 파일이있는 디렉토리를 검색합니다. 먼저 쉘 활성화 스크립트를 실행하지 말고 virtualenv의 python을 직접 사용합니다. $PATH은 virtualenv로 패치하지 않습니다. 결과, 쉘 명령 which python은 시스템 파이썬 실행 파일의 경로를 출력합니다.

는 사실, 파이썬 층에서, $PATH 그냥 "파이썬"를 입력하는 대신 전체 경로를 입력하여 VIRTUALENV 경로에서 파이썬 실행 파일을 호출, 배쉬 층에서 편의를위한 $PATH 패치, 무관, 무엇이 가장 중요한 파이썬 실행 파일이 호출되지만 실행 방법은 아닙니다.

+0

이것이 맞습니다. 나는 그것을 시도했다. "sys.executable"은 venv의 python 경로를 출력하지만 "which python"은 시스템 파이썬을 출력합니다. 고맙습니다 @georgexsh – Kumaran

1

귀하의 문제 (복사 귀하의 코멘트) 여기에 있습니다 : 내가 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를 만들면 약간의 조정만으로 루트 액세스 권한을 얻을 수 있습니다. 자신의 시스템이고 요구 사항이 어쨌든 루트 암호를 알고 있다면 중요하지 않습니다.

+0

'PYTHONPATH'는 여기서 아무 것도하지 않습니다. virtualenv는 여기에서 * active *입니다.'Process'는 virtualenv 파이썬도 사용합니다. 다른 문 역시 명백히 거짓입니다. – georgexsh

+0

OP 상태는 처음에 virtualenv를 가질 수 있습니다 활성화되어 있지만 그는 sudo를 사용하여 Python과 그의 스크립트를 실행합니다.이 스크립트는 venv PATH를 자신의 시스템 기본값으로 대체합니다. – Hannu

+0

'sudo venv/bin/python' *는 virtualenv에서 실행 가능한 python을 사용하여 virtualenv를 효과적으로 활성화했습니다. – georgexsh