Python:他のファイルの作業ディレクトリのexecfile?
-
06-07-2019 - |
質問
デフォルトの構成ファイルをロードして、ユーザーが追加の補足構成またはデフォルトのオーバーライドとして独自の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がまだ監視している問題はすべて、現在の作業ディレクトリに関連付けられていません (コードと監視されている問題の正確な詳細を見ることなく、実際に何であるかを診断するのは困難です) ;-)。