Чтение файла, извлечение данных и присвоение переменной из файла python - PullRequest
1 голос
/ 13 февраля 2020

Я пытаюсь извлечь BINPATH, LIBPATH, CPPPATH из файла conan.txt, который выглядит следующим образом:

conan = {

    "conan" : {
        "CPPPATH"     : ['something'],
        "BINPATH"     : ['something'],
        "LIBS"        : ['something'],
        "CPPDEFINES"  : [],
        "CXXFLAGS"    : [],
        "CCFLAGS"     : [],
        "SHLINKFLAGS" : [],
        "LINKFLAGS"   : [],
    },
    "conan_version" : "None",

    "boost" : {
        "CPPPATH"     : ['C:\\.conan\\123456\\1\\include'],
        "LIBPATH"     : ['C:\\.conan\\123456\\1\\lib'],
        "BINPATH"     : ['C:\\.conan\\123456\\1\\lib'],
        "LIBS"        : [],
        "CPPDEFINES"  : [],
        "CXXFLAGS"    : [],
        "CCFLAGS"     : [],
        "SHLINKFLAGS" : [],
        "LINKFLAGS"   : [],
    },
    "boost_version" : "1.69.0"
}
Return('conan')

У меня есть файл scons / python, для которого требуются значения CPPPATH, BINPATH, LIBPATH как переменная. Я пытаюсь извлечь эти значения в следующей функции в Sconscript:

def getCPPPath():
          data = {'Return': lambda x: False}
            with open(file.txt, 'r') as f:
             exec(f.read(), data)
             return (data["conan"]["conan"]["CPPPATH"][0])
             print ("Path is:", ["conan"]["conan"]["CPPPATH"][0])

это дает мне ошибку: ==>

scons: *** Возврат несуществующей переменной '' conan ''

Как мне этого добиться?

Еще раз спасибо

Ответы [ 2 ]

3 голосов
/ 13 февраля 2020

Вы можете использовать следующий код. Обратите внимание, что exe c небезопасен, так как он запускает весь код, который находится в вашем file.txt. Вам также нужно передать фиктивную функцию Return в exec.

data = {"Return": lambda x: False}

with open("file.txt", "r", encoding="utf-8") as f:
    exec(f.read(), data)

print(data['conan']['conan']['BINPATH'][0])
print(data['conan']['boost']['LIBPATH'][0])
print(data['conan']['conan']['CPPPATH'][0])

Prints

['something']
['C:\\.conan\\123456\\1\\lib']
['something']
1 голос
/ 13 февраля 2020

Намного проще и без exe c. Вам нужно назвать свой файл conan.py (<= обратите внимание на окончание .py): </p>

import conan

data = conan.conan
print(data['conan']['BINPATH'])

=> ['something']
...