あなたの問題はここに(あなたのコメントをコピーした)である:私は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を作成してこれを行うと、少しの調整だけでルートアクセスが可能になります。それがあなた自身のシステムであり、要件がルートパスワードの知識であるならば、それは重要ではありません。
あなたは親プロセスがvirtualenv pythonで始まったのでしょうか? – georgexsh
@georgexshはいです。実際、これらの機能はフラスコアプリの一部です。 – Kumaran
私は上記のプログラムの固定版をテストしました(例えば、あなたは 'func2()'をProcessのパラメータとして持っていましたが 'func2'や他のいくつかの修正がありました)、実際にはvirtualenvのバージョンを返します。プロセスを生成する直前に 'os.system(" python ")をメインプログラムに追加し、そこで何が起こるかを見てください。 – Hannu