2016-09-22 5 views
2

어떻게 파이썬 스크립트 자체를 변경할 수 있습니까?어떻게 파이썬 스크립트 자체를 변경할 수 있습니까?

내가 같은 파이썬 스크립트 (run.py)을하고 싶은, 그것을 아래로 끓여이

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

이러한 스크립트가 실행되는 다음 번에이

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

인가처럼 보일 것이다 어떤 방법 으로든 가능합니까? 스크립트는 외부 리소스를 사용할 수 있습니다. 그러나 모든 것을 실행하려면 run.py -file을 실행하면됩니다.

편집 : 충분히 명확하지는 않지만 스크립트는 다른 파일이 아닌 자체적으로 업데이트해야합니다. 물론, 스크립트 옆에 간단한 구성 파일을 허용하면이 작업은 간단합니다.

답변 :

사실은 생각보다 훨씬 쉽다. @khelwood의 제안은 잘 작동하고, 스크립트를 열고, 자신의 컨텐츠를 작성하는 것은 전혀 문제가되지 않습니다. @ Gerrat의 솔루션도 훌륭하게 작동합니다. 파일 한 줄에 하나의 문자가 포함 a.txt을 확인

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:])) 
+0

예 가능합니다. 실제로 그 목표를 달성하는 데는 여러 가지 방법이 있습니다. –

+0

네, 가능하지만 그 이유는 무엇입니까? – Jaco

+1

'open ('run.py ','w ') ...'을 사용하여 스크립트를 열고 원하는 경우 스크립트를 변경할 수 있습니다. 그것이 당신이 알고 싶었던 것입니까? – khelwood

답변

3

: 이것은 내가 그것을 봉착하는 방법입니다 : 스크립트에서 다음

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 씩 증가합니다.

-1

: (a 때마다 그 실행의 값을 변경) 예를 들어

# -*- 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

당신이 원하는 것은 {sys} 레벨에서 파일을 조작해야한다는 것입니다. 기본적으로 현재 파일을 읽고 수정하고 덮어 쓰며 현재 모듈을 다시로드합니다. 내가 궁금해해서 잠깐 놀았지만 파일 잠금 및 파일 사용 권한 문제가 발생했습니다. 그것들은 이고 아마도 해결할 수 있습니다, 그러나 나는 이것이 당신이 여기서 원하는 것을 정말로 의심합니다.

첫째, 일반적으로 코드와 데이터를 분리하는 것이 좋습니다. 예외는 있지만 대부분의 경우 런타임에서 변경할 수있는 프로그램 부분을 파일에서 구성을 읽고 동일한 파일에 변경 사항을 기록하려고합니다. 둘째

는 : idomatically, 대부분의 파이썬 프로젝트는

여기에 설정라는 파일에서 읽을 수있는 YAML 라이브러리를 사용하는 간단한 스크립트의 구성

에 대한 YAML를 사용합니다.YAML ', 그리고 가치 증가'A '때마다 프로그램이 실행 :

런타임 출력은 다음과 같습니다
#!/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