2017-10-27 4 views
0

私はvirtualenvを使ってプログラムを実行しています。しかし、ここで生成されたマルチプロセッシングは、システムPythonをデフォルトで使用しています。どうすればvirtualenv pythonを使うのですか?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

私は上記のプログラムの固定版をテストしました(例えば、あなたは 'func2()'をProcessのパラメータとして持っていましたが 'func2'や他のいくつかの修正がありました)、実際にはvirtualenvのバージョンを返します。プロセスを生成する直前に 'os.system(" python ")をメインプログラムに追加し、そこで何が起こるかを見てください。 – Hannu

答えて

2

sudo venv/bin/pythonとすると、effectively activated virtualenvで、virtualenvで直接実行可能なpythonを使用してください。

multiprocessing.Process子孫プロセスfork()で、exec()がない場合、親プロセスと同じpython実行可能ファイルを使用します。 Pythonの実行可能ファイルのパスを実行しているかを決定するためにwhichを使用しないでください

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

:あなたがすることによって、使用中のpythonの実行可能ファイルを確認することができ

whichは、Bashコマンドとして$PATHの各要素を検索します。実行可能なファイル "python"を含むディレクトリは、virtualenvのpythonを直接使用します。シェル起動スクリプトを実行するのではなく、最初に$PATH結果、シェルコマンドwhich pythonは、システムpython実行可能ファイルのパスを出力します。

は、実際には、Pythonの層で、$PATHは単に「パイソン」を入力するのではなく、完全なパスを入力して、virtualenvのパスでPythonの実行ファイルを起動するには、Bashの層での便宜のためである$PATHにパッチを当てる、無関係であり、何が最も重要Python実行可能ファイルが呼び出されますが、呼び出される方法はありません。

+0

これは正しいです。私はそれを試してみました。 "sys.executable"はvenvのpythonパスを出力しますが、 "which python"はシステムpythonを出力します。ありがとう@georgexsh – Kumaran

1

あなたの問題はここに(あなたのコメントをコピーした)である:私はsudoを使用して、それを実行していた

@georgexsh。デフォルトでは、sudo を使用すると、システムpythonが使用されます。ですから、私は "sudo venv/bin/python main.py"を使ってプログラムを実行しました。私がここでvenvのpythonを使っていても、 "os.system( 'python')"の "/ usr/bin/python"を返します。私はしません この動作を理解します

ここで説明するものは、あなたのvirtualenvがアクティブでないものです。

virtualenv (. venv/bin/activate)をアクティブにすると、起動スクリプトは、PYTHONPATHが正しいように環境を変更し、仮想envディレクトリの最初にPythonの実行可能ファイルが検索され、見つかるようにします。これがvirtualenvの動作です。

virtualenvディレクトリからPythonバイナリを実行するだけで、環境が仮想環境に設定されないため、以降のPython呼び出しでデフォルトパスが使用されます。

sudoを実行すると、新しいプロセス/シェルが作成され、仮想環境を継承しません。 sudo -Eを使用して環境を渡すことはできますが、それはあなたのsudoによって異なります。すべての環境で動作するはずの防弾バージョンは、まずvirtualenvを起動してからスクリプトを実行するシェルを実行することです。このような何か:これは、rootとしてbashシェルを実行

sudo -- bash -c ". /home/test/mytest/bin/activate; which python" 

は、仮想環境を活性化し、最終的にそれが使用するPythonのがわかります。上記のコマンドをあなたの仮想環境のパスで変更するだけでうまくいくかもしれません。

システムが共有されている場合、セキュリティ上の観点から通常のユーザーに許可するのは恐ろしいことです。普通のユーザーがパスワードレスのsudoを作成してこれを行うと、少しの調整だけでルートアクセスが可能になります。それがあなた自身のシステムであり、要件がルートパスワードの知識であるならば、それは重要ではありません。

+0

'PYTHONPATH'はここでは何もしません。virtualenvは* active *です。ここで' Process'はvirtualenv pythonも使います。他のステートメントも明白に間違っています... – georgexsh

+0

コメント状態として、最初にvirtualenvしかし、彼は、sudoを使ってPythonと彼のスクリプトを実行します。これは、venv PATHを彼またはシステムのデフォルトに置き換えます。 – Hannu

+0

'sudo venv/bin/python' *はvirtualenvで実行可能なpythonを使ってvirtualenvを効果的に起動しました。 – georgexsh

関連する問題