是否可以从同一个脚本中永久更改Python脚本中的变量?

时间:2013-12-21 10:24:35

标签: python bash save

听我说:

我想从bash:python my_python_script.py set_api <api_key>向脚本传递一些参数,但我希望api_key作为永久变量存储在同一个脚本中。我想知道这是否可能,因为我记得其他选项,比如我可以简单地将变量存储在不同的文件中,并确保我的脚本在其他任何文件之前读取该文件。

什么是最好/最安全的方法?

3 个答案:

答案 0 :(得分:5)

虽然修改其他人提到的源文件的方法可能会有效,但我强烈建议您查看其他解决方案,例如存储配置文件以及正在更改的相关信息。如果你不想自己编写这个功能(可以像一个隐藏文件一样简单,就像脚本一样,只有一行包含一个api键),你可以查看{{3}等解决方案。使用ConfigParser,甚至只是JSON一个对象。当您需要访问该信息(例如API密钥的值)时,您可以读入配置文件。

一般情况下,如果您需要通过值来引用某些内容,请使用词典。例如,如果我的api密钥是“abc”,而不是访问foo.abc,我可以在d = {"abc": value}上放置字典foo并访问foo.d["abc"]

同样,正如其他人所提到的,编写自修改代码通常被认为是不好的做法,因为它很难阅读和维护。如果您能够使用其中的代码文件写入目录,则很少有理由使用配置/持久状态文件修改该文件。

答案 1 :(得分:0)

理论上可以让程序更改自己的源代码。您所要做的就是打开文件进行写入并将所需数据写入其中。正如所讨论的here,您实际上无法将数据插入到文件中,因此您基本上需要传递整个源代码以及将新api_key值分配到file.write(),这将非常麻烦,特别是如果您的代码很复杂。这是一个冒险且不太优雅的解决方案的众多原因之一。无论如何你想要玩它,我绝对建议你在某处备份原始代码。

答案 2 :(得分:0)

你尝试做这样的事情:

def store(const_name, value):
    import re
    with open(__file__, 'r') as f:  # read source of this script
        content = f.read()
        changed = re.replace('^'+const_name+'.*$', const_name + ' = '+ str(value))
    with open(__file__, 'w') as f:  # write source of this script
        f.write(changed)

这种方法不安全,你不能在现实生活中使用它,因为有人可能会破坏你的剧本或改变它来做邪恶的事情。