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

2024-05-15 09:14:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试从一个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''

我怎样才能做到这一点


Tags: 文件txtdatareturnsomethinglibsconanlibpath
3条回答

您可以使用以下代码。注意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更容易,而且不需要执行。 您需要将文件命名为conan.py(<;=注意.py结尾):

import conan

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

=> ['something']

假设你想让柯南和斯科恩在一起,还有另一种方法。如果这是“普通”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,特别是第二个代码段和the SCons docs on SConscript files

相关问题 更多 >