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