簡體   English   中英

讀取文件並提取數據並從 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 更容易且無需使用。 您需要將文件conan.py (<= 注意 .py 結尾):

import conan

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

=> ['something']

假設您嘗試使用 SCons 設置 Conan,還有另一種方法。 如果這是“正常”的 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 文件,它應該會按預期工作。

另請參閱柯南文檔,特別是第二個代碼片段,以及SConscript 文件上的 SCons 文檔

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM