2014-06-19 129 views
0

我是Python和編程的新手,所以這可能很容易,但我找不到合適的答案。我正在嘗試做以下事情。我想在模塊中有一個模塊,它應該由我的主模塊進行修改。 此外,如果具有變量和變量的模塊已經存在,從一開始就不清楚。 目前我做了以下內容:修改其他模塊中的變量

# test2.py 
import os 

# creates module test1 
if os.path.isfile('test1.py') and os.path.getsize('test1.py') > 8: 
    pass 
else: 
    txt = open('test1.py','w') 
    txt.write('testvar = {}') 
    txt.close() 

import test1 
testvar = test1.testvar 

我testmodule如下所示:

# test.py 
import test2 

testvar = test2.testvar 
# now modify testvar 

txt = open('test1.py','w') 
txt.write('testvar = '+repr(testvar)) 
txt.close() 

這工作,如果在Python運行test.py但它有缺點,我需要一個用於任何類似testvar變量的獨立模塊。我寧願如果我可以有一個單一的模塊與許多這樣的變量,並使用某種test1.testvar.update(entry)-方法來更改變量。 此外,如果我使用py2exe創建一個exe文件,那麼應用程序不會識別testvar變量。所以這個方法還有一個問題。 我想要所有這些的原因是在程序的許多不同運行中更改變量。 謝謝你的任何建議。

+6

請停止這樣做。使用普通文件存儲變量,例如JSON格式或XML。你想要做的是非常難看的。 – poe123

+2

或[''pickle''](https://docs.python.org/2/library/pickle.html)。請記住,python是一種純粹解釋的語言。代碼中的值不是常量,而是在運行時動態加載的值,並沒有真正的性能優勢。自我修改代碼只是一種災難。 – aruisdante

+0

@ poe123正如我寫的,我已經假設,這將是糟糕的。這只是我能做的最好的事情。是否有理由爲什麼我應該使用XML或JSON而不是* .py?從我剛讀的JSON文件看起來就像* .py一樣。 –

回答

1

您正在嘗試使用Python來動態創建新的Python代碼,然後將它加載到原始程序中並執行......?

這是一種適用於各種重大和次要災害的食譜。不要這樣做。

如果您需要以一種持續的方式從一個程序運行到另一個程序存儲數據,有很多好方法可以做到這一點。 Python的標準shelve module是一個非常簡單的方法。你基本上只是打開一個文件,並立即開始使用它像一個dict對象,它可以存儲(幾乎)其他任何東西。

import shelve 

sh = shelve.open("myshelf") 

sh["foo"] = (1,2,3,4) 
sh["bar"] = "I like spam" 

sh.close() 

sh = shelve.open("myshelf") 
print sh["foo"] 
print sh.keys() 

UPDATE:如果你想人類可讀的輸出文件,請嘗試使用廣泛使用的JSON serialization format代替。

  • 不像shelfjson模塊需要你明確保存和恢復字典對象。
  • 無需額外代碼,JSON格式不能像shelf那樣序列化許多數據類型。例如,它可以序列化爲dict/list,但它不能序列化set並將tuple更改爲list

使用JSON的東西是一樣的。請注意,元組sh["foo"]在被序列化和反序列化時以列表形式返回:

import json 

# Load sh from JSON file or create a new dictionary if it doesn't exist 
try: 
    sh = json.load(open("storage.json","r")) 
except IOError: 
    sh = {} 

sh["foo"] = (1,2,3,4) 
sh["bar"] = "I like spam" 

# Save sh to JSON file 
json.dump(sh, open("storage.json","w")); 

# Reload it 
sh = json.load(open("storage.json","r")) 

print sh["foo"] 
print sh.keys() 
+0

謝謝。這看起來不錯。這只是一個編碼問題,這意味着我無法以可讀形式打開myshelve。然而,一切都可以毫無問題地被訪問,所以它至少是機器可讀的。 該文檔說選項writeback = True會使所有工作緩慢。在我的情況下,我將擁有像myshelve中的5個字典變量,每個變量包含幾百個條目。你會期待這已成爲一個問題嗎? –

+0

我不確定你的意思; 'shelf'格式不應該是人類可讀的。我不認爲回寫會對這種規模的數據集產生顯着的性能影響。 –

+0

好的。我想這是因爲我目前並沒有太多的經驗,我喜歡直接控制輸出,所以我試圖打開導致編碼問題的文件myshelf。如果這是正常的行爲,我會好起來的。當我在腳本中讀取和打印變量時,一切都很好。 –