我想通过编写一些带有变量赋值和函数的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 =)?
答案 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
命名空间来共享脚本的知识。如果这看起来有点令人困惑,请对globals
和locals
以及命名空间进行一些阅读。
答案 1 :(得分:0)
import sys
sys.path.insert(0,"path to your file")
from yourFile import *