2016-04-01 8 views
0

私はあるプログラムの出力ファイルを別のプログラムの入力ファイルに変換する小さなスクリプトを書いています。ファイルを動的にインポート

これらの入力ファイルを作成するには、追加のユーザー入力が必要です。 このユーザーを別のファイルに入力したいと考えています。スクリプトを実行するとき、ユーザーは彼の設定ファイルを文字列としてsys.argvで指定できます。今文字列で指定したファイル内の変数をインポートするためのベストプラクティスは何

N_a = 2 
N_b = 5 
N_c = ... 
. 
. 
. 

設定ファイルは変数だけではなく、機能が含まれていますか? さらに重要:このファイルは、ユーザーが2回の実行の間に何かを変更した場合にスクリプトが実行されるたびに再ロードする必要があります。任意のファイルごとにこれを行うことは可能ですか、それとも.pyファイルである必要がありますか?

+2

あなたは 'configparser'モジュールの使用を検討しましたか?設定ファイルは、モジュールで説明されている構文を使用して作成し、それを解析するために使用できます。 – chapelo

答えて

2

質問に答えるには、evalを使用して任意の文字列を取得し、それをPythonコードとして評価します。あるいは、execを使用して任意の文字列をPython式として実行することもできます。一般的に

、それはそれはあなたのプログラムが脆弱になりますように、これを行うにはをお勧めしません - 誰かがあなたのコードは、このevalまたはexec機能を使用していた知っていたことを想像し、悪意のあるユーザーが自分の設定ファイルにいくつかのPythonコードを挿入することができあなたのシステムは本当にダメージを与えます。

むしろ、あなたがしたいことは、ユーザーの設定ファイルを解析し、変数を適切に設定することだと思います。たとえば:

# file configParser.py 
userfile = 'users_file.txt' 
values = {} 
with open(userfile, 'r') as infile: 
    for line in userfile: 
     name, value = line.strip().split('=') 
     values[name] = value 

あなたは、後でこれらの値にアクセスするにはvalues辞書を使用することができます格納された値が文字列であることを

values['N_a'] # holds '2' 
values['N_b'] # holds '5' 
# etc... 

注意を。あなたはintまたはfloat sまたはw/eに変換できます。

このアプローチでは、常に行がvariable_name = valueというパターンで構成されていることを前提としています。ユーザーがこのパターンから逸脱した場合、または無効な値を指定した場合、パーサーはクラッシュする可能性があります。 configparserのようなモジュールが用意されており、ユーザーがプログラムにデータを提供するために使用できる設定ファイル形式を指定できるようになっています。

+1

すばらしい答え:) configparser recomendationに++ –

1
最も安全な手動でファイルを解析することであろう

...

しかし、あなたは確かに使用することができ

execfile("/path/to/a.py") 

ものの...はい、その結末は、あなたが.blah、.confをしたいものは何でもすることができ、 ...

関連する問題