Question

J'ai donc réalisé un court script Python pour lancer des fichiers sous Windows avec des extensions ambiguës en examinant leur numéro magique/signature de fichier d'abord:

J'aimerais le compiler en .exe pour faciliter l'association (soit en utilisant bbfreeze, soit en réécrivant en C), mais j'ai besoin d'une sorte de fichier de configuration convivial pour spécifier les chaînes d'octets et les chemins de programme correspondants.Fondamentalement, je veux mettre ces informations dans un fichier texte brut d'une manière ou d'une autre :

magic_numbers = {
# TINA
'OBSS': r'%PROGRAMFILES(X86)%\DesignSoft\Tina 9 - TI\TINA.EXE',

# PSpice
'*version': r'%PROGRAMFILES(X86)%\Orcad\Capture\Capture.exe', 
'x100\x88\xce\xcf\xcfOrCAD ': '', #PSpice?

# Protel
'DProtel': r'%PROGRAMFILES(X86)%\Altium Designer S09 Viewer\dxp.exe', 

# Eagle
'\x10\x80': r'%PROGRAMFILES(X86)%\EAGLE-5.11.0\bin\eagle.exe',
'\x10\x00': r'%PROGRAMFILES(X86)%\EAGLE-5.11.0\bin\eagle.exe',
'<?xml version="1.0" encoding="utf-8"?>\n<!DOCTYPE eagle ': r'%PROGRAMFILES(X86)%\EAGLE-5.11.0\bin\eagle.exe',

# PADS Logic
'\x00\xFE': r'C:\MentorGraphics\9.3PADS\SDD_HOME\Programs\powerlogic.exe', 
}

(Les octets hexadécimaux ne sont que des octets arbitraires, pas des caractères Unicode.)

Je suppose qu'un fichier .py dans ce format fonctionne, mais je dois le laisser non compilé et l'importer d'une manière ou d'une autre dans le fichier compilé, et il y a toujours un tas de contenu superflu comme { et , être confus/bousiller.

J'ai regardé YAML, et ce serait génial sauf que cela nécessite d'abord des éléments binaires encodés en base64, ce qui n'est pas vraiment ce que je veux.Je préférerais que le fichier de configuration contienne des représentations hexadécimales des octets.Mais aussi des représentations ASCII, si c'est la seule signature du fichier.Et peut-être aussi des expressions régulières.:D (Dans le cas où le format XML peut être écrit avec différentes quantités d'espaces, par exemple)

Des idées?

Était-ce utile?

La solution

Vous avez déjà votre réponse :YAML.

Les données que vous avez publiées ci-dessus stockent des représentations textuelles de données binaires ;ce sera bien pour YAML, il vous suffit de l'analyser correctement.Habituellement, vous utiliserez quelque chose du module binascii ;dans ce cas, il est probable que binascii.a2b_qp fonction.

magic_id_str = 'x100\x88\xce\xcf\xcfOrCAD '
magic_id = binascii.a2b_qp(magic_id_str)

Pour clarifier, j'utiliserai un caractère Unicode comme moyen simple de coller des données binaires dans le REPL (Python 2.7) :

>>> a = 'Φ'  
>>> a  
'\xce\xa6'  
>>> binascii.b2a_qp(a)  
'=CE=A6'  
>>> magic_text = yaml.load("""  
... magic_string: '=CE=A6'  
... """)  
>>> magic_text  
{'magic_string': '=CE=A6'}  
>>> binascii.a2b_qp(magic_text['magic_string'])  
'\xce\xa6'  

Autres conseils

Je suggérerais de faire cela un peu différemment.Je dissocierais ces deux paramètres l'un de l'autre :

  1. Signature numérique magique ===> type MIME
  2. mimetype ==> lanceur de programme

Pour la première partie, j'utiliserais python-magie, une bibliothèque qui a des liaisons vers libmagique.Vous pouvez demander à python-magic d'utiliser un fichier magique personnalisé comme celui-ci :

import magic
m = magic.Magic(magic_file='/path/to/magic.file')

Vos utilisateurs peuvent spécifier un fichier magique personnalisé mappant les nombres magiques aux types MIME.La syntaxe des fichiers magiques est documenté.Voici un exemple montrant le fichier magique pour le format TIFF :

# Tag Image File Format, from Daniel Quinlan (quinlan@yggdrasil.com)
# The second word of TIFF files is the TIFF version number, 42, which has
# never changed.  The TIFF specification recommends testing for it.
0       string          MM\x00\x2a      TIFF image data, big-endian
!:mime  image/tiff
0       string          II\x2a\x00      TIFF image data, little-endian
!:mime  image/tiff

La deuxième partie est alors assez simple, puisqu’il vous suffit maintenant de spécifier les données texte.Vous pouvez opter pour un format INI ou yaml, comme suggéré par d'autres, ou vous pouvez même avoir simplement un simple fichier délimité par des tabulations comme celui-ci :

image/tiff         C:\Program Files\imageviewer.exe
application/json   C:\Program Files\notepad.exe

J'ai utilisé certains packages pour créer des fichiers de configuration, également yaml.Je vous recommande d'utiliser ConfigParser ou ConfigObj.

Enfin, la meilleure option Si vous souhaitez créer un fichier de configuration lisible par l'homme avec des commentaires, je vous recommande fortement d'utiliser ConfigObj.

Apprécier!

Exemple de ConfigObj

Avec ce code :

Vous pouvez également utiliser ConfigObj pour les stocker.Essaye celui-là:importer configobj

def createConfig(path):
    config = configobj.ConfigObj()
    config.filename = path
    config["Sony"] = {}
    config["Sony"]["product"] = "Sony PS3"
    config["Sony"]["accessories"] = ['controller', 'eye', 'memory stick']
    config["Sony"]["retail price"] = "$400"
    config["Sony"]["binary one"]= bin(173)
    config.write()

Vous obtenez ce fichier :

[Sony]
product = Sony PS3
accessories = controller, eye, memory stick
retail price = $400
binary one = 0b10101101
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top