我有一个输入文件,其中包含我想在 python 程序中使用的变量。使用 import 引入变量是否更好:
import imp
inputData = imp.load_source(...)
或者使用以下方式读取文件更好:
for line in open('inputfile'):
无论哪种方式都有优点或缺点吗?
提前致谢!
每个人肯定都有优点和缺点。逐行方法绝对“更安全”,因为您不只是执行在源文件中找到的任意代码。但是,由于您似乎不太关心恶意用户,因此我认为这在您的环境中不是问题。逐行方法的明显缺点是在编写它时对您来说工作量更大。imp.load_source
显然更容易编码。
我相信这样做的“正确”方法是使用内置函数execfile
,因为这种情况基本上是该函数存在的确切原因。这样,您可以为整个执行提供自己的命名空间。它在功能上与 类似imp.load_source
,只是它不创建模块。你会做这样的事情:
loaded_variables = {}
execfile('foo.bar', loaded_variables)
值得一提的是,如果你不能信任你的用户,你就不应该允许执行任意代码!即使这很痛苦,如果您不相信该文件不会包含恶意代码,最好对您的输入/配置文件进行逐行解析或使用其他格式。
如果您希望 Python 执行文件中的语句,最好导入而不是作为字符串读取文件(这open(...)
会导致)。
如果你要导入文件,你不妨把它放在 PYTHONPATH 中列出的目录中,然后简单地使用
import config
另一方面,如果您不控制文件的内容并且这些内容是由潜在的恶意用户提供的,那么您必须先解析内容,而不是盲目地执行它的内容。
这不是一个权衡利弊的选择。如果您关心安全性,则不得导入该文件。
当你import
一个文件时,代码被执行。您永远不应允许执行任意代码。在打开如此巨大的安全漏洞之前请仔细考虑。
有很多文件格式可以轻松解析,您可以使用它们来代替,或者您甚至可以创建自己的格式。特别是如果分配只包含文字,而不是任意表达式。