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语法(您的给定示例文件是).
如果您确定它只包含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 样式变量解析器)。
请记住,如果您有一个包含 .py 作为文件扩展名的内容的“文本”文件,您可以随时执行以下操作:
import mytextfile
print(mytestfile.FOO)
Run Code Online (Sandbox Code Playgroud)
当然,这假设文本文件就 Python 而言在语法上是正确的。在我参与的一个项目中,我们做了类似的事情。将一些文本文件转换为 Python 文件。古怪但也许值得考虑。
只是为了提供不同的方法,请注意,如果您的原始文件设置为
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)
与@jil的答案相同,但是该答案特定于某些历史版本的Python。
在现代Python(3.0+)中:
exec()
Run Code Online (Sandbox Code Playgroud)
取代 execfile()
| 归档时间: |
|
| 查看次数: |
29206 次 |
| 最近记录: |