2

別の質問に関連して、変更される可能性のあるパスをどのように説明しますか? たとえば、プログラムがプログラムと同じディレクトリにあるファイルを呼び出している場合、*nix で単にパス ".\foo.py" を使用できます。ただし、どうやら Windows は、"C:\Python_project\foo.py" のようにパスをハードコードするのが好きなようです。

進路が変わるとどうなる?たとえば、ファイルが C: ドライブではなく、サム ドライブまたはドライブ文字を変更できる外付けドライブにある場合があります。ファイルはプログラムと同じディレクトリにある可能性がありますが、コード内のドライブ文字と一致しません。

プログラムをクロスプラットフォームにしたいのですが、使用するパスコードブロックを決定するためにos.nameなどを使用する必要があると思います。

4

4 に答える 4

5

簡単な答え: 環境に基づいて絶対パスを計算します。

本当に必要なのは、いくつかの指針です。標準ライブラリのさまざまな場所から収集できるさまざまなランタイムおよび環境情報があります (これらは、Windows にアプリケーションをデプロイするときに役立ちます)。

だから、最初にいくつかの一般的なこと:

  1. os.path- 多くのクロスプラットフォーム パス操作を備えた標準ライブラリ モジュール。あなたの親友。「os.pathをたどる」私はかつて本で読んだことがあります。
  2. __file__- 現在のモジュールの場所。
  3. sys.executable- 実行中の Python の場所。

これで、これら 3 つの情報源から必要なものをかなり収集できます。os.path の関数は、ツリーを回避するのに役立ちます。

  • os.path.join('path1', 'path2')- クロスプラットフォームの方法でパス セグメントを結合する
  • os.path.expanduser('a_path')a_path-ユーザーのホーム ディレクトリでパスを見つける
  • os.path.abspath('a_path')- 相対パスを絶対パスに変換します
  • os.path.dirname('a_path')- パスがあるディレクトリを取得します
  • もっとたくさん...

これを組み合わせると、たとえば次のようになります。

# script1.py
# Get the path to the script2.py in the same directory
import os
this_script_path = os.path.abspath(__file__)
this_dir_path = os.path.dirname(this_script_path)
script2_path = os.path.join(this_dir_path, 'script2.py')
print script2_path

そしてそれを実行します:

ali@work:~/tmp$ python script1.py 
/home/ali/tmp/script2.py

あなたの特定のケースでは、「作業ディレクトリ」と「スクリプトがあるディレクトリ」の概念を少し混同しているようです。これらは同じ場合もありますが、異なる場合もあります。たとえば、「作業ディレクトリ」は変更できるため、それを使用する関数は、探しているものを見つけることができる場合がありますが、他のものを見つけることはできません。subprocess.Popenはその一例です。

常に絶対パスを渡すと、作業ディレクトリの問題が発生することはありません。

于 2008-11-13T10:54:40.540 に答える
0

具体的には、「ファイル...foo.pyを呼び出す」とはどういう意味ですか?

  1. 輸入?もしそうなら、パスは完全にあなたのプログラムの外にあります。シェル レベルで、またはその他を使用してPYTHONPATH環境変数を設定します。たとえば、2 行のシェル スクリプトを記述して環境変数を設定し、Python を実行できます。.c:\

    ウィンドウズ

    SET PYTHONPATH=C:\path\to\library
    python myapp.py
    

    Linux

    export PYTHONPATH=./relative/path
    python myapp.py
    
  2. 実行ファイル? インポートの使用を検討してください。

  3. 読み取りと評価 インポートの使用を検討してください。

PYTHONPATH が複雑すぎる場合は、モジュールを Python の lib/site-packages ディレクトリに配置します。デフォルトで PYTHONPATH に配置されます。

于 2008-11-13T10:54:11.430 に答える
0

ファイルが常にプログラムと同じディレクトリにある場合:

def _isInProductionMode():
    """ returns True when running the exe, 
        False when running from a script, ie development mode.
    """
    return (hasattr(sys, "frozen") or # new py2exe
           hasattr(sys, "importers") # old py2exe
           or imp.is_frozen("__main__")) #tools/freeze

def _getAppDir():
    """ returns the directory name of the script or the directory 
        name of the exe
    """
    if _isInProductionMode():
        return os.path.dirname(sys.executable)
    return os.path.dirname(__file__)

動作するはずです。また、私は自分のアプリケーションに py2exe を使用しましたが、他の exe 変換アプリではテストしていません。

于 2008-11-13T08:15:58.737 に答える
-1

私はos.getcwd()を使用して理解しました。また、 os.path.joinを使用して、OSに基づいて正しいパス形式を自動的に決定する方法についても学びました。コードは次のとおりです。

def openNewRecord(self, event): # wxGlade: CharSheet.<event_handler>
    """Create a new, blank record sheet."""
    path = os.getcwd()
    subprocess.Popen(os.path.join(path, "TW2K_char_rec_sheet.py"), shell=True).stdout

動作しているようです。アイデアをありがとう。

于 2008-11-13T13:37:10.313 に答える