【问题标题】:Read a file and extract data and assign to a variable from a python file读取文件并提取数据并从 python 文件中分配给变量
【发布时间】:2020-02-13 14:44:29
【问题描述】:

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

我怎样才能做到这一点?

【问题讨论】:

  • 柯南不是 dict 还是 json 吗?
  • 看起来像一个有效的 python 代码。您可以使用exec(f.read(), myvar) 然后将值作为myvar['conan']['boost']['BINPATH']
  • @Ch3steR,我在配方文件中使用了 scons 生成器来生成这个文本文件
  • @hurlenko:我的代码返回此错误:Traceback(最近一次调用最后一次):文件“testfile3.py”,第 3 行,在 exec(f.read(), data) 文件中“”,第 83 行,在 NameError: name 'Return' is not defined

标签: python scons conan


【解决方案1】:

您可以使用以下代码。请注意,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']

【讨论】:

  • 我的代码返回此错误:Traceback(最近一次调用最后一次):文件“testfile3.py”,第 3 行,在 exec(f.read(), data) 文件“",第 83 行,在 NameError: name 'Return' is not defined
  • 您的初始文本示例没有 Return('conan') 部分。我更新了答案
  • 有效!谢谢。但是我如何删除那些方括号,因为它打印如下:['C:\\.conan\\86ed06\\1\\include'] ['C:\\.conan\\86ed06\\1 \\lib'] ['C:\\.conan\\86ed06\\1\\lib']
  • 这些是列表,只使用第一个元素。我更新了答案
  • 您可以通过省略data 参数到exec,在本地范围内执行来自file.txt 的代码。相反,您可以传递本地和全局范围进行执行。我用单个函数Return 定义了全局范围,以便file.txt 中的代码可以使用它。
【解决方案2】:

不使用 exec 会容易得多。 您需要将文件命名为 conan.py

import conan

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

=> ['something']

【讨论】:

  • 我不明白你在 foo.py 中有什么
  • 这适用于您的第一个版本,最后一行没有 return("conan")。
  • 让我知道您是否需要退货声明或为什么要添加它?如果它仍然存在,我将删除我的答案,因为它不符合您最近的更改。
  • return 是必需的,因为此文件是由柯南生成器模块本身创建的。顺便说一句,@hurlenko 的代码有效,谢谢
【解决方案3】:

假设您尝试使用 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 函数,它基本上相当于将一个变量(这里:conan)从一个 SConscript 文件返回到执行它的任何地方。不正确的执行,或者当然缺少变量的存在,足以导致函数抛出。如果您正确获取 SConscript 文件,它应该可以按预期工作。

另见Conan documentation,特别是第二个代码sn-p和the SCons docs on SConscript files

【讨论】:

    猜你喜欢
    • 2013-08-07
    • 1970-01-01
    • 1970-01-01
    • 2015-12-12
    • 2013-07-15
    • 2021-03-18
    • 2023-01-08
    • 2013-12-09
    • 2016-02-19
    相关资源
    最近更新 更多