2013-05-14 63 views
0

我有一个输入文件,我想用在python程序中。它是更好地在变量的使用带来进口:导入vs打开输入文件

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

或者是更好的阅读使用文件:

for line in open('inputfile'): 

是否有优势或劣势无论哪种方式?

在此先感谢!

回答

2

每个都有其优点和缺点。逐行方法绝对“更安全”,因为您不是简单地执行源文件中找到的任何任意代码。但是,由于您似乎不太关心恶意用户,因此我认为这不是您的环境中的问题。逐行方法的明显缺点是,在编写它时它更适合你。代码显然更容易编码。

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

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

值得注意的一个更多的时间,如果你不能信任你的用户,你不应该允许执行任意代码!即使这是一种痛苦,如果您不能相信该文件不包含恶意代码,那么对输入/配置文件进行逐行解析或使用其他格式可能会更好。

+0

谢谢!我在科学界工作,所以我并不担心恶意用户。它的设置让用户指定输入文件。 – user877334

0

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

而且如果你将要导入的文件,你还不如把它放在你的PYTHONPATH中列出的目录,并简单地使用

import config 

在另一方面,如果你不这样做控制文件的内容并且内容由潜在的恶意用户提供,那么首先解析内容而不是盲目地执行它的内容是非常重要的。

这是没有选择权衡利弊。如果您关心安全性,那么您不得导入文件

0

当你import一个文件的代码是执行。你应该从来没有允许执行任意代码。在开启如此巨大的安全漏洞之前仔细考虑。

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