0

Windows Server 2012 で Python の複数のインストールを実行しています。おそらくこれを回避する方法を見つけることができますが、何が起こっているのか知りたいです。私が気付いていないかもしれない他の人々の Python のスケジュールされたタスクを壊した場合に備えて、インストールを根本的に変更することには慎重です。

(以下のコード ボックスはすべて PowerShell です)。

PS C:\> C:\Python34\Scripts\pip.exe list
jdcal (1.0)
pip (7.1.2)
setuptools (12.0.5)
virtualenv (13.1.2)

この Python 3.4 インストールには Django がインストールされていませんが、Python 33x86 インストールからバージョンを取得しているようです。それは正常ですか?

PS C:\> C:\Python34\python.exe -c "import django; print(django.get_version())"
1.6.5
PS C:\> C:\Python33x86\python.exe -c "import django; print(django.get_version())"
1.6.5

Python 3.4 に基づいて Python virtualenv を作成し、そこに Django 1.8.4 をインストールしました。「pip list」を実行すると、正しくインストールされていることが確認されます:-

PS C:\> D:\PyVirtualEnvs\example_py34\Scripts\activate.bat
PS C:\> D:\PyVirtualEnvs\example_py34\Scripts\pip.exe list | Select-String "Django "
Django (1.8.4)

ただし、その virtualenv 内にインポートすると、Django バージョン 1.6.5 が取得されます:-

PS C:\> D:\PyVirtualEnvs\example_py34\Scripts\python.exe -c "import django; print(django.get_version())"
1.6.5

これは virtualenv のバグですか、それとも何か不足していますか?

編集:この質問に関連している可能性がありますか?

EDIT2:ハムサンドイッチで提案されているように、 pyvenvを使用すると同じことが起こります。

4

3 に答える 3

0

この動作の理由を発見しました。PYTHONPATH 環境変数が、マシン上の異常な場所にある Python インストールに設定されました。

documentationによると、モジュールが現在のディレクトリに見つからない場合、 PYTHONPATH がインポート場所として使用されます。

spam という名前のモジュールがインポートされると、インタープリターは最初にその名前の組み込みモジュールを検索します。見つからない場合は、変数 sys.path で指定されたディレクトリのリストで spam.py という名前のファイルを検索します。sys.path は次の場所から初期化されます。

  • 入力スクリプトを含むディレクトリ (または現在のディレクトリ)。
  • PYTHONPATH (シェル変数 PATH と同じ構文のディレクトリ名のリスト)。
  • インストールに依存するデフォルト。

何らかの理由で、アクティブ化/非アクティブ化スクリプトによって PYTHONPATH が設定/設定解除されません。PYTHONHOME を設定しますが、インポートには影響しないようです。これは、virtualenv と pyvenv のバグのように感じます (両方試しました)。

元の activate.bat スクリプトは、$env:PYTHONPATH に影響を与えない "set" 変数を変更します。Activate.ps1 は元の PYTHONPATH を変数に保存し、それを仮想環境ディレクトリに設定し、非アクティブ化時に元の PYTHONPATH を復元しようとします。おそらく Powershell または Python の更新が原因で、これらのどちらも機能しなくなりました。

私たちにとっての解決策は、アクティブ化スクリプトと非アクティブ化スクリプト (PoSh または Bat) を変更して、ハードコードされた 2 つの値の間で PYTHONPATH を切り替えることです。

于 2015-09-15T09:28:34.160 に答える