听我说:
我想从bash:python my_python_script.py set_api <api_key>
向脚本传递一些参数,但我希望api_key
作为永久变量存储在同一个脚本中。我想知道这是否可能,因为我记得其他选项,比如我可以简单地将变量存储在不同的文件中,并确保我的脚本在其他任何文件之前读取该文件。
什么是最好/最安全的方法?
答案 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)
这种方法不安全,你不能在现实生活中使用它,因为有人可能会破坏你的剧本或改变它来做邪恶的事情。