读取文件并提取数据并分配给 python 文件中的变量

Read a file and extract data and assign to a variable from a python file

我正在尝试从 conan.txt 文件中提取 BINPATH、LIBPATH、CPPPATH,如下所示:

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: *** Return of non-existent variable ''conan''

我怎样才能做到这一点?

您可以使用以下代码。请注意,exec 是不安全的,因为它会运行您 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])

版画

['something']
['C:\.conan\123456\1\lib']
['something']

使用 exec 更容易 w/o。 您需要将文件命名为 conan.py(<= 请注意 .py 结尾):

import conan

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

=> ['something']

假设您正在尝试使用 SCons 设置柯南,还有另一种方法。如果这是“正常”Python,那么其他两个答案就完全正确了。但是,由于您显然在 Conan 中使用了 SCons 生成器(否则,您不会以该文件结束),因此您有一个与 SCons 兼容的文件。 SCons 自然地在 Python 之上添加了用于管理其“自己的”文件的内容。

因此,您根本不需要 exec。这就是您所需要的:

conan = env.SConscript("SConscript_conan")
# Note: you may need to change the path to SConscript_conan depending on your 
#       build system configuration. If you installed Conan in `build`, the
#       path should be "build/SConscript_conan"
env.MergeFlags(conan["conan"])

这还可以确保您添加所需的所有其他标志,而不仅仅是路径。如果您决定添加另一个库,还可以节省您的手动设置。

Return('conan') 是一个 SCons 函数,它基本上等同于从 SConscript 文件返回一个变量(这里:conan)到任何执行它的地方。不正确的执行,或者当然是变量不存在,足以导致函数抛出。如果您正确获取 SConscript 文件,它应该可以按预期工作。

另见 Conan documentation, specifically the second code snippet, and the SCons docs on SConscript files