Я хотел бы сохранить сложную конфигурацию, написав код Python с назначением переменных и функциями, которые я буду импортировать позже с помощью класса ConfigReader.
В принципе до сих пор я написал свой файл конфигурации:
a=1
И класс, который работает как
c=ConfigReader("C:\my_file")
print(c.a)
Для этого я использовал exec(), но теперь я также хочу, чтобы файл конфигурации знал свое собственное имя файла (поскольку каталог предоставляет информацию для некоторых переменных)
Мне нужен файл конфигурации, например:
a=parse_project_number_from_dir(__file__)
Кажется, мне нужно заменить exec() некоторой загрузкой модуля mod в Python 3? Это самый простой способ выполнить простой файл, чтобы он знал о своем пути?
Кроме того, я бы хотел, чтобы мой класс ConfigReader читал все переменные в словаре. (С exec я просто посмотрел на locals()). Что мне теперь делать, и не могу ли я импортировать вспомогательные импорты в файл конфигурации (например, функцию parse_project_number_from_dir), но только то, что я на самом деле там определяю (т.е. A =)?
Когда вы exec
Python script, нет имени файла, потому что вы даете exec
строку или скомпилированный объект. Команда exec
не имеет способа узнать, где вы получили эту строку.
Но есть способ поделиться знаниями с конфигурационным файлом, который вы передаете на exec
. Например...
Скажем, у вас есть файл конфигурации, в котором говорится
print myname
Затем запустите следующий Python script:
ns = {}
ns["myname"] = "sample.cfg"
s = open("sample.cfg","r")
exec s in ns # in 3.x use exec(s,ns) instead
Это создает новое пространство имен, и в этом пространстве имен создается переменная с именем myname
. Поскольку script знает имя файла, который он собирается открыть, он может назначить это переменной. Эффект такой же, как exec 'myname = "sample.cfg"' in ns
.
Затем, когда вы выполняете файл конфигурации, вы делитесь своим знанием script, сообщая ему использовать пространство имен ns
. Если это кажется немного запутанным, сделайте небольшое чтение о globals
и locals
и пространствах имен.
exec
официально является оператором Python, таким как def
или class
поэтому вам нужно искать его в нужном месте. Я думаю, что в документации есть ссылка на функцию eval()
. И фигурные скобки просто делают пустой dict
как хранятся пространства имен.
import sys
sys.path.insert(0,"path to your file")
from yourFile import *