配置知道其文件名的python脚本

时间:2011-05-29 20:11:11

标签: python

我想通过编写一些带有变量赋值和函数的Python代码来保存复杂的配置,稍后我将通过ConfigReader类导入它。

基本上到目前为止我已经编写了配置文件:

a=1

一个类似

的课程
c=ConfigReader("C:\my_file")
print(c.a)

为此,我使用了exec(),但现在我也希望配置文件知道自己的文件名(因为目录提供了一些变量的信息)

所以我需要一个配置文件,如:

a=parse_project_number_from_dir(__file__)

似乎我需要在Python 3中通过一些imp模块加载来替换exec()?这是执行简单文件以使其了解其路径的最简单方法吗?

此外,我希望我的ConfigReader类将所有变量读入字典。 (用exec我只看了locals())。我现在应该怎么做,我不能在配置文件中导入辅助导入(比如parse_project_number_from_dir函数),但是我实际在那里定义了什么(即a =)?

2 个答案:

答案 0 :(得分:2)

当你exec Python脚本时,没有文件名,因为你给了exec一个字符串或一个编译对象。 exec命令无法知道你在哪里得到这个字符串。

但是有一种方法可以将您传递给exec的配置文件分享知识。例如......

假设您有一个说

的配置文件
print myname

然后运行以下Python脚本:

 ns = {}
 ns["myname"] = "sample.cfg"
 s = open("sample.cfg","r")
 exec s in ns # in 3.x use exec(s,ns) instead

这会创建一个新的命名空间,并在该命名空间中创建一个名为myname的变量。由于脚本知道要打开的文件的名称,因此可以将其分配给变量。效果与exec 'myname = "sample.cfg"' in ns相同。

然后,当您执行配置文件时,通过告诉它使用ns命名空间来共享脚本的知识。如果这看起来有点令人困惑,请对globalslocals以及命名空间进行一些阅读。

答案 1 :(得分:0)

import sys
sys.path.insert(0,"path to your file")
from yourFile import *