2014-06-19 92 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。如果这是正常的行为,我会好起来的。当我在脚本中读取和打印变量时,一切都很好。 –