2014-09-13 12 views
5

Ich versuche eine Umgebungsvariable zu speichern, die Python als Dictionary einlesen kann. Wenn das eine schlechte Idee ist, lassen Sie mich bitte Ihre Vorschläge wissen, ich bin begierig zu lernen. Ich mache mir Sorgen, dass, wenn ich die Daten so viele Umgebungsvariablen speichere, es schwierig werden könnte, sie zu verwalten.So speichern Sie ein Python-Wörterbuch als Umgebungsvariable

Ich programmierte einen Raspberry Pi, um eine Tür basierend auf der Anrufer-ID von eingehenden Telefonanrufen zu einer Twilio-Nummer zu entsperren, es funktioniert super. Ich möchte meinen Code auf Github für Feedback freigeben, aber ich möchte meine Liste der Telefonnummern nicht mit der Welt teilen, also versuche ich, es als Umgebungsvariable zu speichern und dann Python es einzulesen.

Das Telefon Zahlen sind in einem Python-Dictionary wie folgt.

building_admins = { 
    "+27792955555": "De Wet", 
    "+27722855555": "Marysol", 
    "+27878085555": "Blomerus", 
} 

Ich versuche, es als eine Umgebungsvariable wie diese auf Ubuntu 14,04

export BUILDING_ADMINS='{ 
    "+27792955555": "De Wet", 
    "+27722855555": "Marysol", 
    "+27878085555": "Blomerus", 
}' 

1) speichern kann ich nicht Linux die Umgebungsvariable zu speichern bekommen, gibt es etwas, was ich tun könnte Bring es zum Laufen?

2) Ich glaube, es muss einen besseren Weg geben, dies zu tun, und ich gehe in die falsche Richtung, aber nichts, was ich mit Googeln zu finden scheint, löst das Problem, vor dem ich stehe. Bitte zeigen Sie mir in die richtige Richtung.

Antwort

2

Eine Umgebungsvariable ist nicht das, was ein Skriptbenutzer festlegen möchte. Verwenden Sie das json Modul und eine Datei:

import json 

with open('numbers') as f: 
    numbers = json.load(f) 

print numbers['+27792955555'] # De Wet 

Wenn auf Github Hochladen tun, um die Zahlen Datei nicht laden oder eine gefälschte hochladen.

+3

Achten Sie darauf, 'numbers.json' nicht zu laden, indem Sie es entweder im' .gitignore' Ihres Repos ignorieren oder es aus einer dotfile im Home-Verzeichnis des Benutzers und damit außerhalb des Repos (zB '~/.numbers.json'). Siehe auch ['os.path.expanduser'] (https://docs.python.org/2/library/os.path.html#os.path.expanduser), wenn Sie die letztere Option wählen. –

3

Wenn Sie die Umgebung verwenden möchten, sollten Sie das Python-Wörterbuch als JSON serialisieren und dump/load das beim Festlegen/Abrufen der Umgebungsvariablen. Sie können auf die Umgebung zugreifen, indem Sie das Attribut os des Moduls environ verwenden. Sie können JSON mithilfe des Moduls json sichern/laden. Sie sollten vielleicht auf eine maximale Länge von Umgebungsvariablen achten, wenn es so etwas gibt.

Wenn ich Sie wäre, würde ich eine SQLite-Datenbank verwenden, siehe https://docs.python.org/2/library/sqlite3.html. Dies würde Ihnen Persistenz, ein definiertes Schema und eine nette Schnittstelle für den Umgang mit Ihren Daten geben.

-1

Es ist möglich! Just do

import os 
os.environ.__dict__["_data"]["yourkey"] = {"key":0} #Your data 
print (os.environ.__dict__["_data"]["yourkey"]) #Will print out value! 

Es ist ein wenig kompliziert, aber funktioniert!

+0

Während 'os.environ ['TEST'] = 'test'' gesetzt ist, bedeutet das, dass '! Echo $ TEST' in einer ipython-Shell den korrekten Wert ausgibt. Wenn Sie versuchen, Wörterbücher zu stopfen, explodiert es. – jooks

1

Ich weiß nicht, ob Sie das suchen, aber ich bin hier gelandet, als ich versucht habe, ein Wörterbuch als Linux-Umgebungsvariable zu speichern, um es in meiner App zu verwenden.

Was ich tat, war es als eine Zeichenfolge wie folgt zu speichern:

export BUILDING_ADMINS="{'+27792955555': 'De Wet','+27722855555': 'Marysol','+27878085555': 'Blomerus'}' 

Und dann auf dem Python-Code Sie es lesen und es in ein Wörterbuch verwandeln diese (entnommen aus: Convert a String representation of a Dictionary to a dictionary?): mit

import ast 
import os 

ba_dict = ast.literal_eval(os.environ["BUILDING_ADMINS"]) 

Wenn Sie geben

type(ba_dict) 

Sie sollten Ihre Zeichenfolge sehen nun ein dict .

<class 'dict'> 

Hoffe, das hilft jemand anderem!