У меня есть некоторый код, который загружает файл конфигурации по умолчанию, а затем позволяет пользователям предоставлять свои собственные файлы Python в качестве дополнительной дополнительной конфигурации или переопределения значения по умолчанию:Python: execfile из рабочего каталога другого файла?
# foo.py
def load(cfg_path=None):
# load default configuration
exec(default_config)
# load user-specific configuration
if cfg_path:
execfile(cfg_path)
Существует проблема, хотя: execfile()
выполняет директивы в файл, указанный cfg_path
, как если бы он находился в рабочем каталоге foo.py
, а не в его собственной рабочей директории. Таким образом, директивы import
могут выйти из строя, если файл cfg_path
, скажем, from m import x
, где m
является модулем в том же каталоге, что и cfg_path
.
Как сделать execfile()
из рабочего каталога его аргумента или иначе добиться эквивалентного результата? Кроме того, мне сказали, что execfile
устарел в Python 3 и что я должен использовать exec
, поэтому, если есть лучший способ, которым я должен это делать, я все уши.
Примечание: Я не думаю, что решения, которые просто изменяют рабочий каталог, верны. Насколько я могу судить, эти модули не будут размещены на пути поиска модуля интерпретатора.
Спасибо за ваш ответ. К сожалению, это не работает для меня. 'execfile()', похоже, запускает совершенно новый процесс с собственным рабочим каталогом, который не совпадает с тем, с которого я запускаю. –
Нет, @Kyle, 'execfile' не запускает отдельный процесс, и он ** делает ** уважение к текущему рабочему каталогу. Редактирование моего ответа, чтобы показать простой пример, доказывающий, что вы ошибаетесь. –