2016-09-22 6 views
2

Pythonスクリプト自体を変更するにはどうすればよいですか?どうすればPythonスクリプト自体を変更できますか?

それを煮詰めるために、私は、スクリプトは、それが

a = 1 
b = 1 
print a + b 
# do something here such that the first line of this script reads a = 2 

ようになり実行され、次の時間があるように、この

a = 0 
b = 1 
print a + b 
# do something here such that the first line of this script reads a = 1 

のようなPythonスクリプト(run.py)を持っていると思いますこれはどんな方法でも可能ですか?スクリプトは外部リソースを使用することがあります。しかし、すべてを動作させるには、run.py -fileを実行するだけです。

編集: 十分にはっきりしていないかもしれませんが、スクリプトはそれ自身を更新する必要があります。他のファイルは更新しないでください。確かに、スクリプトの隣に単純な設定ファイルを許可したら、この作業は簡単です。

回答:

それは実際には思ったよりもはるかに簡単です。 @khelwoodの提案はうまく動作し、スクリプトを開き、それ自身のコンテンツを書くことは全く問題がない。 @ Gerratのソリューションもうまく動作します。例えば

# -*- coding: utf-8 -*- 
a = 0 
b = 1 
print a + b 

content = [] 
with open(__file__,"r") as f: 
    for line in f: 
     content.append(line) 

with open(__file__,"w") as f: 
    content[1] = "a = {n}\n".format(n=b) 
    content[2] = "b = {n}\n".format(n=a+b) 
    for i in range(len(content)): 
     f.write(content[i]) 
+0

はい可能です。実際には、その目標を達成するためのいくつかの方法があります。 –

+0

はい、可能ですが、なぜですか? – Jaco

+1

あなたは 'open( 'run.py'、 'w')...'であなたのスクリプトを開いて、それを変更することができます。それはあなたが知りたかったものですか? – khelwood

答えて

3

を(毎回その実行aの値を変更する):これは私がそれを抱えている方法です

a = 0 
b = 1 
print a + b 

with open(__file__, 'r') as f: 
    lines = f.read().split('\n') 
    val = int(lines[0].split(' = ')[-1]) 
    new_line = 'a = {}'.format(val+1) 
    new_file = '\n'.join([new_line] + lines[1:]) 

with open(__file__, 'w') as f: 
    f.write('\n'.join([new_line] + lines[1:])) 
-1

1行に1つの文字を含むファイルa.txtを行います。

0 

は、次にあなたのスクリプトでは、そのファイルを開いて、値を取得し、その後すぐにそれを変更:

with open('a.txt') as f: 
    a = int(f.read()) 
with open('a.txt', 'w') as output: 
    output.write(str(a+1)) 
b = 1 
print a+b 

プログラムの最初の実行では、a0になり、ファイルは1に変更されます。その後の実行では、毎回aが1ずつインクリメントされます。

0

あなたが求めているのは、{sys}レベルでファイルを操作する必要があることです。基本的には、現在のファイルを読み込み、変更したり、上書きしたり、現在のモジュールをリロードしたりします。私は好奇心を持っていたのでこれを簡単に演奏しましたが、ファイルのロックとファイルのアクセス許可の問題が発生しました。それらはおそらく解決可能ですが、私はこれがあなたがここで本当に望んでいないと思う。

最初に、コードとデータを分離しておくことをお勧めします。これには例外がありますが、ほとんどの場合、実行時に変更できるプログラムの部分をファイルから読み込んで、同じファイルに変更を書き込む必要があります。

第二:idomatically、ほとんどのPythonのプロジェクトが設定

ためYAMLを使用ここにconfigというファイルから読み込みをYAMLライブラリを使用して簡単なスクリプトです。YAML」との値がインクリメント 『』たびに、プログラムの実行:

実行時の出力は次のようになります
#!/usr/bin/python 
import yaml 

config_vals = "" 
with open("config.yaml", "r") as cr: 
    config_vals = yaml.load(cr) 

a = config_vals['a'] 
b = config_vals['b'] 
print a + b 

config_vals['a'] = a + 1 
with open("config.yaml", "w") as cw: 
    yaml.dump(config_vals, cw, default_flow_style=True) 

初期YAML設定ファイルは次のようになります
$ ./run.py 
3 
$ ./run.py 
4 
$ ./run.py 
5 

a: 1 
b: 2 
+0

実際、最初の段落で説明していることはまさに私が望むものです。 – ImportanceOfBeingErnest

関連する問題