7

デフォルトの構成ファイルをロードし、ユーザーが追加の補足構成またはデフォルトのオーバーライドとして独自のPythonファイルを提供できるようにするコードがいくつかあります。

# foo.py

def load(cfg_path=None):
    # load default configuration
    exec(default_config)

    # load user-specific configuration
    if cfg_path:
        execfile(cfg_path)

ただし、問題があります。によって指定されたファイルで、それ自体の作業ディレクトリではなく、の作業ディレクトリにあるかexecfile()のようにディレクティブを実行します。したがって、ファイルが、たとえば、と同じディレクトリ内のモジュールがどこにあるかを確認すると、ディレクティブが失敗する可能性があります。cfg_pathfoo.pyimportcfg_pathfrom m import xmcfg_path

execfile()その引数の作業ディレクトリからどのようにすればよいですか、またはそうでなければ同等の結果を達成しますか?また、execfilePython 3では非推奨であり、使用する必要があると言われているexecので、これを行うためのより良い方法があれば、私はすべての耳です。

注:作業ディレクトリを変更するだけの解決策は正しいとは思いません。私が知る限り、それはそれらのモジュールをインタプリタのモジュールルックアップパスに配置しません。

4

1 に答える 1

7

os.chdirを使用すると、必要に応じて作業ディレクトリを変更できます ( の作業ディレクトリを抽出できますcfg_path) os.path.dirname。実行が完了したときに復元したい場合は、まず os.getcwdで現在のディレクトリを取得してくださいcfg_path

Python 3 では確かに削除されます (ファイル、コンテンツ、次にそれらexecfileを読み取るシーケンスを優先して) が、現在 Python 2.6 でコーディングしている場合は、 2to3ソースからソースへの変換を扱うため、心配する必要はありません。これらすべてをスムーズかつシームレスに。compileexec

編集:OPはコメントでexecfile、別のプロセスを起動し、現在の作業ディレクトリを尊重しないと述べています。これは誤りです。次の例は、誤りであることを示しています。

import os

def makeascript(where):
  f = open(where, 'w')
  f.write('import os\nprint "Dir in file:", os.getcwd()\n')
  f.close()

def main():
  where = '/tmp/bah.py'
  makeascript(where)
  execfile(where)
  os.chdir('/tmp')
  execfile(where)

if __name__ == '__main__':
  main()

これを私のマシンで実行すると、次のような出力が生成されます。

Dir in file: /Users/aleax/stko
Dir in file: /private/tmp

実行時に設定された作業ディレクトリを使用し続けることを明確に示してexecfile います。execfile(実行されたファイルが作業ディレクトリを変更した場合、それはexecfileリターン後に反映されます-すべて同じプロセスで行われているためです!)。

したがって、OPがまだ観察している問題は、現在の作業ディレクトリに関連付けられていません(コードと観察された問題の正確な詳細を確認せずに、実際に何であるかを診断するのは困難です;-)。

于 2009-11-28T18:40:42.083 に答える