5

Python を使い始めたばかりで、ちょっとしたガイダンスが必要です。

私は Mac を使用していますが、元の Apple インストールと同様に、Python の python.org ビルドがインストールされています。

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

いくつか突っついた後、私はそれが PYTHONPATH / sys.path であると信じるようになりました。パスを表示するテスト スクリプトを作成しました。では、ターミナル ウィンドウを介して実行した場合と、シェル スクリプトとして直接実行した場合とでは、なぜ異なるパスが得られるのでしょうか?

私の2つの質問は次のとおりです。

  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 の出力は次のとおりです (この場合、「do shell script」ステップで 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']"
4

1 に答える 1

4

なぜ違うのですか?

2 つの異なる Python インタープリターを実行していて、それらのデフォルトsys.path値が異なるためです。

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

pythonターミナルで実行すると、おそらく(またはおそらくそのフレームワーク内のどこかへの)リンクである(と/usr/local/bin/python入力して確認できます)。そして、python.org からのその Python は、/Library/Frameworks/Python.framework/Versions/7.3/ の周りにセットアップするようにコンパイルされています。which python/Library/Frameworks/Python.framework/Versions/7.3/bin/pythonPython.app/Contents/MacOS/pythonsys.path

python一方、 Launch Services を介して実行すると、おそらく が得られます。/usr/bin/pythonこれは、(うまくいけば) の周りに組み込まれた shim であり、 の周りに/System/Library/Frameworks/Python.framework/Versions/2.7/bin/python設定するようにコンパイルされています。sys.path/System/Library/Frameworks/Python.framework/Versions/2.7/

pythonこれらの場合に異なることを行う理由は/usr/local/bin、ログインにはまったく含まれていませんが、 (または他の) ファイルPATHの行によってパスの先頭に追加されるためです。~/.profileこのファイルは、ターミナルのシェル セッションによって読み取られますが、Launch Services セッションでは読み取られません。

すべての環境で同じ Python を使用したい場合は、単に の代わりに/usr/local/bin/pythonorを明示的に実行できます。(ログイン PATH にアクセスすることもできますが、それは非常に悪い考えです。または、 から取得することもできますが、これは少し不便です。)/usr/bin/pythonpython/usr/local/bin~/.profile

補足として、これは python.org のインストールが非常に壊れていることを示しています。

/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 が必要な場合は、別のインストールが必要です。そうしないと、何の役にも立ちません。

于 2012-10-23T00:33:05.180 に答える