如何将文件"源"到python脚本中

Mar*_*ter 13 python bash python-2.7

我有一个/etc/default/foo包含一行的文本文件:

FOO="/path/to/foo"
Run Code Online (Sandbox Code Playgroud)

在我的python脚本中,我需要引用变量FOO.

将文件"源" /etc/default/foo到我的python脚本中的最简单方法是什么,就像我在bash中一样?

. /etc/default/foo
Run Code Online (Sandbox Code Playgroud)

jil*_*jil 11

你可以使用execfile:

execfile("/etc/default/foo")
Run Code Online (Sandbox Code Playgroud)

但请注意,这将根据您的程序源评估文件的内容.除非您完全信任来源,否则存在潜在的安全隐患.

它还意味着该文件需要是有效的python语法(您的给定示例文件是).

  • Python3版本:`exec(open("/ etc/default/foo").read())`http://stackoverflow.com/questions/436198/what-is-an-alternative-to-execfile-in-python -3 (3认同)

lar*_*sks 5

如果您确定它只包含VAR="QUOTED STRING"样式变量,如下所示:

FOO="some value"
Run Code Online (Sandbox Code Playgroud)

然后你可以这样做:

>>> with open('foo.sysconfig') as fd:
...   exec(fd.read())
Run Code Online (Sandbox Code Playgroud)

这让你:

>>> FOO
'some value'
Run Code Online (Sandbox Code Playgroud)

(这实际上与execfile()另一个答案中建议的解决方案相同。)

这种方法具有重大的安全隐患;如果不是FOO="some value"您的文件包含:

os.system("rm -rf /")
Run Code Online (Sandbox Code Playgroud)

那你就麻烦了。

或者,您可以这样做:

>>> with open('foo.sysconfig') as fd:
...   settings = {var: shlex.split(value) for var, value in [line.split('=', 1) for line in fd]}
Run Code Online (Sandbox Code Playgroud)

这会为您提供一本字典settings,其中包含:

>>> settings
{'FOO': ['some value']}
Run Code Online (Sandbox Code Playgroud)

settings = {...}行使用的是字典理解。你可以用for循环等多行几行来完成同样的事情。

当然,如果文件包含 shell 样式的变量扩展,${somevar:-value_if_not_set}那么这将不起作用(除非您编写自己的 shell 样式变量解析器)。


Har*_*lin 5

请记住,如果您有一个包含 .py 作为文件扩展名的内容的“文本”文件,您可以随时执行以下操作:

import mytextfile

print(mytestfile.FOO)
Run Code Online (Sandbox Code Playgroud)

当然,这假设文本文件就 Python 而言在语法上是正确的。在我参与的一个项目中,我们做了类似的事情。将一些文本文件转换为 Python 文件。古怪但也许值得考虑。


Foo*_*oon 5

只是为了提供不同的方法,请注意,如果您的原始文件设置为

export FOO=/path/to/foo
Run Code Online (Sandbox Code Playgroud)

您可以执行source /etc/default/foo; python myprogram.py(或. /etc/default/foo; python myprogram.py)并且在myprogram.py源文件中导出的所有值在 os.environ 中可见,例如

import os
os.environ["FOO"] 
Run Code Online (Sandbox Code Playgroud)


Hac*_*k-R 5

与@jil的答案相同,但是该答案特定于某些历史版本的Python。

在现代Python(3.0+)中:

exec()
Run Code Online (Sandbox Code Playgroud)

取代 execfile()

  • 难道不应该使用上下文管理器(“with open…”)来确保正确清理文件句柄吗? (5认同)