0

我有一个输入文件,其中包含我想在 python 程序中使用的变量。使用 import 引入变量是否更好:

import imp
inputData = imp.load_source(...)

或者使用以下方式读取文件更好:

for line in open('inputfile'):

无论哪种方式都有优点或缺点吗?

提前致谢!

4

3 回答 3

2

每个人肯定都有优点和缺点。逐行方法绝对“更安全”,因为您不只是执行在源文件中找到的任意代码。但是,由于您似乎不太关心恶意用户,因此我认为这在您的环境中不是问题。逐行方法的明显缺点是在编写它时对您来说工作量更大。imp.load_source显然更容易编码。

我相信这样做的“正确”方法是使用内置函数execfile,因为这种情况基本上是该函数存在的确切原因。这样,您可以为整个执行提供自己的命名空间。它在功能上与 类似imp.load_source,只是它不创建模块。你会做这样的事情:

loaded_variables = {}
execfile('foo.bar', loaded_variables)

值得一提的是,如果你不能信任你的用户,你就不应该允许执行任意代码!即使这很痛苦,如果您不相信该文件不会包含恶意代码,最好对您的输入/配置文件进行逐行解析或使用其他格式。

于 2013-05-14T21:23:45.190 回答
0

如果您希望 Python 执行文件中的语句,最好导入而不是作为字符串读取文件(这open(...)会导致)。

如果你要导入文件,你不妨把它放在 PYTHONPATH 中列出的目录中,然后简单地使用

import config

另一方面,如果您不控制文件的内容并且这些内容是由潜在的恶意用户提供的,那么您必须先解析内容,而不是盲目地执行它的内容。

这不是一个权衡利弊的选择。如果您关心安全性,则不得导入该文件。

于 2013-05-14T21:24:05.560 回答
0

当你import一个文件时,代码被执行。您永远不应允许执行任意代码。在打开如此巨大的安全漏洞之前请仔细考虑。

有很多文件格式可以轻松解析,您可以使用它们来代替,或者您甚至可以创建自己的格式。特别是如果分配只包含文字,而不是任意表达式。

于 2013-05-14T21:24:16.463 回答