1
votes

Lire un fichier et extraire des données et attribuer à une variable à partir d'un fichier python

J'essaie d'extraire BINPATH, LIBPATH, CPPPATH d'un fichier conan.txt qui ressemble à:

scons: *** Return of non-existent variable ''conan''

J'ai un fichier scons / python qui a besoin des valeurs CPPPATH, BINPATH, LIBPATH comme variable. J'essaie d'extraire ces valeurs dans la fonction suivante dans 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])

Cela me donne une erreur:

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')

Comment puis-je atteindre cet objectif?


4 commentaires

N'est-ce pas conan un dict ou json?


Ressemble à un code Python valide. Vous pouvez utiliser exec(f.read(), myvar) puis obtenir la valeur comme myvar['conan']['boost']['BINPATH'] etc


@ Ch3steR, j'ai utilisé le générateur scons dans le fichier de recette pour générer ce fichier texte


@hurlenko: mon code renvoie cette erreur: Traceback (dernier appel le plus récent): Fichier "testfile3.py", ligne 3, dans <module> exec (f.read (), data) Fichier "<string>", ligne 83 , dans <module> NameError: le nom 'Return' n'est pas défini


3 Réponses :


3
votes

Vous pouvez utiliser le code suivant. Notez que exec n'est pas sécurisé car il exécute tout le code qui se trouve dans votre file.txt . Vous devez également passer une fonction de Return factice dans exec .

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

Tirages

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])


8 commentaires

mon code renvoie cette erreur: Traceback (dernier appel le plus récent): Fichier "testfile3.py", ligne 3, dans <module> exec (f.read (), data) Fichier "<string>", ligne 83, dans < module> NameError: le nom 'Return' n'est pas défini


Votre exemple de texte initial ne Return('conan') pas la partie Return('conan') . J'ai mis à jour la réponse


Ça marche! Merci Mais comment puis-je supprimer ces crochets car il s'imprime comme ci-dessous: ['C: \\. Conan \\ 86ed06 \\ 1 \\ include'] ['C: \\. Conan \\ 86ed06 \\ 1 \\ lib '] [' C: \\. conan \\ 86ed06 \\ 1 \\ lib ']


Ce sont des listes, utilisez simplement le premier élément. J'ai mis à jour la réponse


Impressionnant. Pouvez-vous vous dire ce que signifie data = {"Return": lambda x: False}


Vous pouvez exécuter du code à partir de file.txt dans une portée locale en omettant l'argument data à exec . Au lieu de cela, vous pouvez transmettre des étendues locales et globales pour l'exécution. J'ai défini la portée globale avec une seule fonction Return afin que le code de file.txt puisse l'utiliser.


Comment puis-je extraire des données du fichier..txt en tant que Sconscript (script de construction) dans mon fichier python?


édité ma question plus loin pour votre référence s'il vous plaît, merci



1
votes

Beaucoup plus facile et sans utiliser exec. Vous devez nommer votre fichier conan.py (<= notez la fin .py):

import conan

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

=> ['something']


4 commentaires

Je ne comprends pas ce que vous avez dans foo.py


Cela fonctionne pour votre 1ère version sans le retour ("conan") dans la dernière ligne.


Faites-moi savoir si vous avez besoin de la déclaration de retour ou pourquoi l'avez-vous ajoutée? S'il reste, je supprimerai ma réponse car elle n'est pas conforme à votre récente modification.


return est requis puisque ce fichier a été créé par le module générateur de conan lui-même. BTW, le code de @ hurlenko a fonctionné, merci



0
votes

En supposant que vous essayez de configurer Conan avec SCons, il existe un autre moyen. S'il s'agissait de Python "normal", les deux autres réponses auraient été tout à fait correctes. Cependant, comme vous utilisez clairement le générateur SCons dans Conan (sinon, vous n'auriez pas fini avec ce fichier), vous avez un fichier compatible avec SCons. SCons a naturellement des ajouts en plus de Python pour gérer ses "propres" fichiers.

Par conséquent, vous n'avez pas besoin du tout d'exécutif. c'est tout ce dont vous avez besoin:

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"])

Cela garantit également que vous ajoutez tous les autres indicateurs dont vous avez besoin, pas seulement les chemins. Enregistre également votre configuration manuelle si jamais vous décidez d'ajouter une autre bibliothèque.

Return('conan') est une fonction SCons, ce qui équivaut fondamentalement à renvoyer une variable (ici: conan ) d'un fichier SConscript à celui qui l'a exécutée. Une exécution incorrecte, ou bien sûr l'absence d'une variable, suffit à provoquer le déclenchement de la fonction. Si vous créez correctement le fichier SConscript, il devrait fonctionner comme prévu.

Voir aussi la documentation Conan , en particulier le deuxième extrait de code, et la documentation SCons sur les fichiers SConscript


0 commentaires