42

グローバルに利用できるようにしたいスクリプトがあります。私は標準のハッシュバングでそれを始めました:

#! /usr/bin/env python

そしてそれを私のvirtualenvのbinディレクトリにリンクしました:

~/environments/project/env/bin/myscript

そして、そのディレクトリをパスに追加しました。コマンドを実行すると:

myscript

ライブラリの 1 つでインポート エラーが発生します。ただし、仮想環境をアクティブにしてスクリプトを実行すると、期待どおりに動作します。

シンボリックリンクの問題を除外しました(スクリプトをbinフォルダー内に移動することも試みました)。また、Pythonでスクリプトを実行しようとしました

python ~/environments/project/env/bin/myscript

以前は、環境をアクティブにしてからスクリプトを実行するスクリプトを使用していましたが、このフォルダーから実行されるスクリプトは、virtualenv のインタープリターとサイト パッケージで実行する必要があるという印象を受けました。なぜこれが機能しないのか、またはこれをデバッグできる方法についてのアイデアはありますか?

4

5 に答える 5

66

スクリプトを virtualenv の bin に入れ、その bin の場所をグローバル PATH に追加しても、virtualenv が自動的にソースされるわけではありません。アクティブにするには、最初にソースを取得する必要があります。

システムが認識しているのは、実行可能ファイルの追加パスを確認して実行することだけです。そのスクリプトには、virtualenv を示すものは何もありません。

ただし、she-bang 行を virtualenv python にハードコードすることもできます。その場合、サイト パッケージはパスに配置されます。

#!/Users/foo/environments/project/env/bin/python

または、別のオプションは、元の pythons スクリプトを呼び出す小さな bash ラッパーを作成することです。これにより、元のスクリプトを汎用の she-bang..

したがって、myscript.py が次の場合: #!/usr/bin/env python...

次に、次を作成できますmyscript

#!/bin/bash

/Users/foo/environments/project/env/bin/python myscript.py

するとmyscript、設定したインタープリターを使用して Python スクリプトが明示的に呼び出されます。

于 2012-08-15T01:51:21.953 に答える
16

virtualenv の仕組みについて混乱していると思います。

簡単に言うと、virtualenv はシェル環境を変更して、Python がさまざまな領域を調べて、インポートしたいモジュールを見つけられるようにします。仮想環境を保存する場所と、virtualenv で実行するソース ファイルを保存する場所の間には、実際には何の関係もありません。必要に応じて、virtualenv を ~/environments/my_env というディレクトリに格納し、virtualenv を使用している間にコーディングしたすべてのソースを ~/projects/my_proj に格納できます。

virtulenvの詳細については、ドキュメントを参照してください。

本当に、モジュールを見つける場所を python に伝える唯一のものは、完全に python に基づいています (どのように機能するかについてはドキュメントを参照してください)。virtualenv を有効にすると、python の動作が変わります。

シェル スクリプトで virtualenv をアクティブにする方法に戻るか、このレシピに従ってスクリプトから直接アクティブにすることができます。

activate_this = '/path/to/env/bin/activate_this.py'
execfile(activate_this, dict(__file__=activate_this))

このルートを選択する場合は、ドキュメントに記載されている情報を念頭に置いてください。

これにより、sys.path が変更され、sys.prefix も変更されますが、既存のインタープリターを使用することもできます。環境内のアイテムは、グローバル アイテムの前に sys.path に最初に表示されます。ただし、グローバル項目には常にアクセスできます (あたかも --system-site-packages フラグが環境の作成に使用されたかどうかにかかわらず)。また、これにより、他の環境またはインポートされたモジュールのアクティブ化を元に戻すことはできません。たとえば、Web リクエストの前に環境をアクティブ化しようとするべきではありません。できるだけ早い段階で 1 つの環境をアクティブ化し、そのプロセスで再度アクティブ化しないでください。

于 2012-08-15T01:52:49.200 に答える
3

代わりに相対パスを追加することはできませんか? これは私のために働いた:

#!./env/bin/python
于 2016-04-16T22:49:30.273 に答える
0

私は同じ問題に直面し、この解決策を思いつきました: https://github.com/jabbalaci/wpython。これwpythonは、venv のローカル Python インタープリターを使用してプログラムを呼び出す " " というスクリプトです。したがって、" " の代わりに " /Users/foo/environments/project/env/bin/python myscript.py" と書くだけで十分wpython /path/to/myscript.pyです。ランチャー スクリプトは次のようになります。

#!/usr/bin/env bash

cd /the/directory/where/myscript.py/is/located
wpython myscript.py
于 2014-11-24T05:44:26.897 に答える