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