2016-04-09 14 views
2

In meiner YAML-Datei ich den unten Eintrag haben:yaml integer Oktal Fehler erzeugen

- type: dir 
    name: .ssh 
    chmod: 0o700 

Nach dem YAML 1.2 specification Abschnitt 3.2.1.3 der 0o700 ist die Art und Weise octals angeben (es gibt auch ein Beispiel in Abschnitt 2.4 jedoch)

, wenn ich die geladene Datei und tun verarbeiten:

import os 
import yaml 
filename = "in.yml" 

with open(filename) as fp: 
    for e in yaml.load(open(filename)): 
     if e['type'] == 'dir': 
      os.mkdir(e['name'], e['chmod']) 

ich TypeError: an integer is required. Was läuft hier falsch?

Ich bin mit Python 3.5

Antwort

3

Was falsch ist, ist, dass Sie, dass Ihre YAML-Bibliothek übernehmen 1.2 die neueste Version unterstützt. Diese YAML-Version stammt aus 2009, aber Sie verwenden PyYaml und das unterstützt nur 1.1. Aus der Nicht-Aktivität der letzten Jahre scheint es ein totes Projekt zu sein, also erwarte nicht, dass dies in absehbarer Zeit gelöst wird.

Sie können

from yaml.resolver import Resolver 

Resolver.add_implicit_resolver(
    'tag:yaml.org,2002:int', 
    re.compile(r'''^(?:[-+]?0b[0-1_]+ 
       |[-+]?0o?[0-7_]+ 
       |[-+]?0[0-7_]+ 
       |[-+]?(?:0|[1-9][0-9_]*) 
       |[-+]?0x[0-9a-fA-F_]+ 
       |[-+]?[1-9][0-9_]*(?::[0-5]?[0-9])+)$''', re.X), 
    list('-')) 

in Ihrem Programm hinzufügen Anerkennung 0o123 irgendwie hinzuzufügen octals (es auch noch die 1,1 octals erkennt).

Bitte beachten Sie, dass die oben nur Werke für Python 3, wie PyYaml anderen Code für Python hat 2.

Sie auch pathlib.Path Typen und deren .mkdir() statt os.mkdir()

+0

ThanX. Weißt du, ob es eine Bibliothek für Python3 gibt, die nicht tot ist? – Sandra

+0

Ich habe mir vor langer Zeit ruamel.yaml angeschaut, es hatte zu dieser Zeit zumindest eine einzige Codebasis. Nicht sicher, was es jetzt ist. – User9123

2

Installieren ruamel.yaml mit in Betracht ziehen sollten (pip install ruamel.yaml). Standardmäßig wird Laden 1.2 wie dokumentiert here:

es sei denn, das YAML Dokument mit einer expliziten Version == 1.1 oder das Dokument beginnt mit geladen wird:

% YAML 1.1

, ruamel.yaml wird Laden Sie das Dokument als Version 1.2.

und

YAML 1.2 nicht mehr akzeptiert Zeichenfolgen, die mit einer 0 und ausschließlich aus Zahlen-Zeichen als Oktal beginnen, müssen Sie solche Strings mit 0o [0-7] + (Null angeben + Kleinbuchstaben o für oktal + ein oder mehrere oktale Zeichen).