读取文件并提取数据并分配给 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
我正在尝试从 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