6

に新しいディレクトリの場所を追加する必要がありますが、問題は、まだ定義されていPYTHONPATHないクリーンな新しくインストールされたシステム (Linux) にいることです。PYTHONPATH私はそれについて読んだり使っPYTHONPATHたりして、よく理解していると思っていましたが、PYTHONPATHまだ存在しないのに何が起こっているのかわかりません。

存在しないものに追加することはできませんが、現在見つかっているすべての重要なライブラリを引き続き機能させたいので、慎重に、Python 内からprint str(sys.path)すべての標準値を取得しました。次に、見つけたばかりのすべてのノードと新しいディレクトリを含めるenvための変数を定義しました。PYTHONPATHしかし、うわー、多くのものが機能しなくなりました! Python は新しいenv-variable でめちゃくちゃになったので、それを削除しなければなりませんでした。その時点で、すべてが再び機能しました。悪いことPYTHONPATHに、システムは非常に混乱し、プロンプトで間違ったコマンドが入力されたときに表示するエラーメッセージを見つけることさえできませんでした.

私の問題は、コロンの欠落や、コロンを使用する必要があるときにセミコロンを使用するなどの単純なものではありません。私がチェックしました。また、新しいノードがなくても問題が発生するため、新しいディレクトリは問題を引き起こしません。では、このアプローチが機能しない理由を説明できる人はいますか?

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

以下に、リクエストに応じて追加の詳細を提供しますが、これ以上読む必要はありません。問題は解決したと思います。PYTHONPATH にリストされているノードがすべての「標準」ノードをオーバーライドするのではなく、新しい追加のエントリになるという説明が重要でした (最初に何が来るかを制御できるように先頭に追加されると思います)。

PYTHONHOME または PYTHONPATH を定義せずにゼロから開始すると、Python 内から次のようになります。

print ':'.join(sys.path)      
:/usr/lib/python2.7:/usr/lib/python2.7/plat-linux2:/usr/lib/python2.7/lib-tk:/usr/lib/python2.7/lib-old:/usr/lib/python2.7/lib-dynload:/usr/local/lib/python2.7/dist-packages:/usr/lib/python2.7/dist-packages:/usr/lib/python2.7/dist-packages/PIL:/usr/lib/python2.7/dist-packages/gst-0.10:/usr/lib/python2.7/dist-packages/gtk-2.0:/usr/lib/python2.7/dist-packages/ubuntu-sso-client   

これを PYTHONPATH として使用する (つまり、Python を呼び出す前に環境変数を定義する) と、Python を明示的に使用しなくても、コマンド プロンプトの機能が非常に低下します。例えば:

$> export PYTHONPATH='/usr/lib/python2.7:/usr/lib/python2.7/plat-linux2:/usr/lib/python2.7/lib-tk:/usr/lib/python2.7/lib-old:/usr/lib/python2.7/lib-dynload:/usr/local/lib/python2.7/dist-packages:/usr/lib/python2.7/dist-packages:/usr/lib/python2.7/dist-packages/PIL:/usr/lib/python2.7/dist-packages/gst-0.10:/usr/lib/python2.7/dist-packages/gtk-2.0:/usr/lib/python2.7/dist-packages/ubuntu-sso-client'

$> echo $PYTHONPATH        
/usr/lib/python2.7:/usr/lib/python2.7/plat-linux2:/usr/lib/python2.7/lib-tk:/usr/lib/python2.7/lib-old:/usr/lib/python2.7/lib-dynload:/usr/local/lib/python2.7/dist-packages:/usr/lib/python2.7/dist-packages:/usr/lib/python2.7/dist-packages/PIL:/usr/lib/python2.7/dist-packages/gst-0.10:/usr/lib/python2.7/dist-packages/gtk-2.0:/usr/lib/python2.7/dist-packages/ubuntu-sso-client

$> IntentionalBadCommand       
Fatal Python error: Py_Initialize: Unable to get the locale encoding    
 File "/usr/lib/python2.7/encodings/__init__.py", line 123    
raise CodecRegistryError,\    
                        ^
SyntaxError: invalid syntax       
Aborted

間違いは、PYTHONPATH が必要なすべての宇宙全体を含む必要があると考えていたことです。はい、投稿する前に RTFM を行いましたが、最初の単語「Augment」の意味を見逃していたようです。したがって、すべてを明示的に指定する必要はないというアドバイスを受けて、必要な追加の追加を指定するだけでよいというアドバイスを受けて、次のことを試しました。

$> export PYTHONPATH=/usr/lib/python2.7/dist-packages/postgresql-pkg

$> echo $PYTHONPATH         
/usr/lib/python2.7/dist-packages/postgresql-pkg

$> IntentionalBadCommand       
IntentionalBadCommand: command not found

上記のpostgresqlパッケージをまだ使用しようとはしていませんが、うまくいっているようです。PYTHONPATH の前に不必要なノードを大量に追加すると、問題が発生したときと同じように問題が発生する理由は、まだ少し不思議です。特に、信頼できるソースである sys.path からエントリを取得したためです。

しかし、とにかく、それはおそらく解決されているので、ありがとう!

4

2 に答える 2

7

sys.path問題が何であるかは明確ではありませんが、PYTHONPATH変数にデフォルト値を追加する必要はないことに注意してください。入力するディレクトリは、検索PYTHONPATHする追加のディレクトリです。システムのデフォルトがに追加されますPYTHONPATH。言い換えれば、大まかに言えば:

sys.path = ":".split( os.environ['PYTHONPATH'] ) + sys.path

の正確な値PYTHONPATHと結果のエラーを表示すると、問題を特定するのに役立ちます。

于 2013-01-25T19:43:31.577 に答える
1

Unix システムでは、/usr/local/lib/python** に変換する必要があります。ここで、** は Python のバージョンです... 2.7 などのように...

あなたの答えは、実際には PYTHONPATH および PYTHONHOME 変数の定義にあります。

http://docs.python.org/2/using/cmdline.html#envvar-PYTHONHOME

デフォルトの検索パスはインストールによって異なりますが、通常は prefix/lib/pythonversion で始まります (上記の PYTHONHOME を参照)。これは常に PYTHONPATH に追加されます。

これも試してみることをお勧めします

import sys    
sys.path.append('Directory you wanna add to the path')

お役に立てれば。

于 2013-01-25T19:40:45.277 に答える