2012-10-22 22 views
5

私はちょうどPythonを使い始めています。Pythonモジュールはターミナルでインポートされますが、Unixシェルではインポートされません。

私はMacを使用していますが、Python.orgのPython.orgビルドと、Appleのオリジナルインストールがあります。

一部のサードパーティ製モジュールを読み込もうとしています。 IDLEまたはターミナルでスクリプトを実行すると、すべて正常に動作します。 CRONジョブとして実行しようとすると、サードパーティのモジュールが見つからないというエラーが表示されます。

私はPYTHONPATH/sys.pathだと考えています。私は私のパスを示すためのテストスクリプトを作成しました。だから、なぜそれがターミナルウィンドウで実行されているのか、シェルスクリプトとして直接実行されているのか、別のパスを取得するのですか?

私の二つの質問は以下のとおりです。

  1. 彼らはなぜ異なっていますか?
  2. サードパーティのモジュールを見つけるために直接シェルプロセスを取得するにはどうすればよいですか?

私はターミナルでそれを実行したときにここに私のsys.path出力です:

['/Library/Scripts', 
'/Library/Scripts/$', 
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7', 
'/Library/Frameworks/Python.framework/Versions/7.3/lib/python27.zip', 
'/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7', 
'/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/plat-darwin', 
'/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/plat-mac', 
'/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/plat-mac/lib-scriptpackages', 
'/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/lib-tk', 
'/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/lib-old', 
'/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/lib-dynload', 
'/Library/Python/2.7/site-packages'] 

ここに私のsys.path出力です私は貝にそれを実行したときに(このケースでは私はAppleScriptではよステップ "シェルスクリプトを実行します"。

"['/Library/Scripts', 
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python27.zip', 
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7', 
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-darwin', 
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac', 
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac/lib-scriptpackages', 
'/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python', 
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk', 
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-old', 
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload', 
'/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/PyObjC', 
'/Library/Python/2.7/site-packages']" 
+2

あなたは間違いなくvirtualenvを調べる必要があります。 Pythonのさまざまなバージョンとプロジェクト固有のパス変数を混​​乱させるのに役立ちます。 –

答えて

4

をなぜ彼らが異なっている?

あなたは2つの異なるPythonインタプリタを実行していて、異なるデフォルトのsys.path値を持っているからです。

これは、システムインストール(またはそのインストールに依存するApple提供のツール)を破ることなく、Python.orgのインストールの標準(またはサイト)ライブラリを変更できるようにするものです。

私はあなたがターミナルでpythonを実行すると、あなたはおそらく/Library/Frameworks/Python.framework/Versions/7.3/bin/python(あるいはそのフレームワークの内部Python.app/Contents/MacOS/pythonどこかへ)へのリンクです/usr/local/bin/pythonを(あなたがwhich pythonを入力していることを確認することができます)、取得していることを推測しています。 python.orgのPythonは、/Library/Frameworks/Python.framework/Versions/7.3/の周りにsys.pathを設定するようにコンパイルされています。あなたが打ち上げサービスを経由してpythonを実行したときに

一方、あなたはおそらく(たぶん)を内蔵しているシム/System/Library/Frameworks/Python.framework/Versions/2.7/周りsys.pathを設定するためにコンパイルされ/System/Library/Frameworks/Python.framework/Versions/2.7/bin/python、周り/usr/bin/pythonを取得しています。

pythonは、これらのケースでは異なることを行い理由は/usr/local/binがまったくログインPATHではありませんが、あなたの~/.profile(または他の)ファイルの行で、パスの先頭に追加されていることです。このファイルは、ターミナルのシェルセッションでは読み込まれますが、起動サービスセッションでは読み込まれません。

すべての環境で同じPythonを使用する場合は、pythonの代わりに/usr/local/bin/pythonまたは/usr/bin/pythonを明示的に実行できます。あなたはログインPATHに/usr/local/binを得ることもできますが、それは非常に悪い考えです。それは少し不便です。

これはあなたのpythonの印です。組織のインストールが非常に壊れています:

/Library/Frameworks/Python.framework/Versions/7.3/lib/python27.zip 

Python 7.3はありません。 Python.orgビルドをアンインストールして再インストールすることを強く考えています。

または、より簡単にアンインストールしてアンインストールしたままで、組み込みのPython 2.7を使用してください。複数の環境を使用する場合は、複数のインストールの代わりにvirtualenvを使用してください。 Appleが2.7.2を提供していて、実際に2.7.3が必要な場合は、別のインストールが必要です。さもなければ、あなたはただの利益のために物事をより困難にしています。

+0

ところで、上記の7.3のフレームワークバージョンはEnthought Python OS Xディストリビューションからのものであり、壊れたインストールではありません。彼らは独自のフレームワークバージョンスキームを使ってpython.org Pythonsと共存していました。 –

関連する問題