質問

デフォルトの構成ファイルをロードして、ユーザーが追加の補足構成またはデフォルトのオーバーライドとして独自の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() foo_pyの作業ディレクトリにあるかのように cfg_path で指定されたファイルのディレクティブを実行します、独自の作業ディレクトリではありません。したがって、 cfg_path ファイルが from m import x の場合、 import ディレクティブは失敗する可能性があります。ここで m cfg_path と同じディレクトリにあるモジュール。

引数の作業ディレクトリから execfile()する方法、または同等の結果を得る方法また、 execfile はPython 3で非推奨であり、 exec を使用する必要があると言われたので、これを行うべきより良い方法があれば、すべての耳。

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

役に立ちましたか?

解決

os.chdir で作業を変更できます希望するディレクトリ( os.path.dirname cfg_path の作業ディレクトリを抽出できます);まず os.getcwd cfg_path の実行が完了したときに復元したい場合。

Python 3は実際に execfile を削除します(ファイルを読み取るシーケンスを優先し、内容を compile 、次に exec します) 、ただし、Python 2.6で現在コーディングしている場合は、 2to3 ソースからソースへの翻訳は、これらすべてをスムーズかつシームレスに処理します。

編集: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がまだ監視している問題はすべて、現在の作業ディレクトリに関連付けられていません (コードと監視されている問題の正確な詳細を見ることなく、実際に何であるかを診断するのは困難です) ;-)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top