Скрипт конфигурации Python, который знает свое имя файла

1

Я хотел бы сохранить сложную конфигурацию, написав код 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 =)?

  • 1
    Какую проблему вы действительно хотите решить? Почему бы просто не импортировать файлы как модуль ?!
  • 0
    Я хочу импортировать файл конфигурации, который может быть любым файлом с кодом Python на жестком диске. Я хочу, чтобы переменные верхнего уровня были доступны. Кстати, имя каталога, в котором находится этот файл, может содержать некоторую информацию, которую мне нужно обработать в файле конфигурации.
Теги:

2 ответа

2

Когда вы 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 и пространствах имен.

  • 0
    Это похоже на решение. Но мне интересно, почему я не могу найти exec с фигурными скобками или оператором "in" в документации ?!
  • 0
    exec официально является оператором Python, таким как def или class поэтому вам нужно искать его в нужном месте. Я думаю, что в документации есть ссылка на функцию eval() . И фигурные скобки просто делают пустой dict как хранятся пространства имен.
Показать ещё 2 комментария
0
import sys
sys.path.insert(0,"path to your file")
from yourFile import *

Ещё вопросы

Сообщество Overcoder
Наверх
Меню