Läsa in variabler från fil/script

Permalänk
Medlem

Läsa in variabler från fil/script

Hej,

Tänkte börja lite bakgrund till min fråga. Jag jobbar som mättekniker och har nydligen fått ansvar över en optisk mätutrustning http://www.gom.com/ för den som är intresserad. I utrustningens mjukvara används phyton för att styra mer avancerade funktioner. Eftersom att jag inte har sysslat med Phyton tidigare så har en del problem dykt upp så jag tänkte höra om någon här på forumet kanske skulle kunna hjälpa mig. Jag har läste en del programmering på gymnasiet såsom C++, php och HTLM så jag brukar kunna förstå vad koden gör även fast jag inte skulle kunna skriva den helt själv.

Det jag behöver hjälp med är att skapa ett huvudscript/fil där jag kan definiera globala variabler såsom sökvägar och annat som alltid är samma för alla andra script/program jag skapar. Som liknelse så i en anna mjukvara som använder C/visual basic som programspråk har jag en textfil där vi definierar tex. "output = C:\filer\output", i programmen läser jag då in filen (readPCMFile, kan vara specifik för den mjukvaran) och kan därefter bara ange "output" så blir det följdaktigen C:\filer\output. Behöver jag ändra mapp där filer skall lagras så behöver jag bara ändra i textfilen. Jag vill ådstakomma samma sak i phyton men vet inte hur jag ska gå tillväga. Så min fråga är, hur kopplar jag variabler till en fil/script.

Som sagt, jag är ny på Phyton och jag har försökt läsa på men blir inte riktigt klok. Om ni tycker min fråga är dum så hänvisa mig gärna till en bra källla där jag kan läsa på.

Med vänliga hälsningar

Upptäckte att "Globala variabler" har en annan betydelse i phyton
Visa signatur
Permalänk

Nu vet jag inte om jag förstått det rätt. men om C:\readPCMFile är din fil med variabler som tex innehåller:

output = 'output=C:\filer\output' x=5

Kan du i dina python program köra detta kommando för att köra koden.

exec(open('C:\readPCMFile').read())

annars kanske detta är något?
http://docs.python.org/3.3/library/configparser.html

Permalänk
Medlem

Bättre att skriva det som en modul:

#filnamn: settings.py output = r'C:\filer\output'

#annan fil import settings my_output_file = settings.output + r'\filename' #eller "from settings import *" för att komma åt alla namn globalt

Permalänk
Medlem

Det gustavwth skrev fungerade prefekt så stort tack men ska prova det du skrev. Vet inte om det är bättre i mitt fall att ha det som modul eftersom att en fil kan jag lagra på en nätverksdisk med låst behörighet, vet inte om det fungerar med en modul.

Visa signatur
Permalänk
Hedersmedlem

Det allra mest "korrekta" är troligen att skapa en gemensam konfigurationsfil som läses med `ConfigParser`. Läsningen av denna fil skulle dock smidigt kunna hanteras i en modul.

Du får då en "plaintext"-konfigurationsfil som är enkelt redigerbar, och du måste inte importera variablerna globalt, vilket inte är trevlig praxis (och rent utav problematiskt i vissa fall).

Ett minimalt exempel:

Konfigurationsfil (här lagd i "C:\filer\config"; se dokumentation för ConfigParser för att se vilket format konfigurationsfiler har):

[GOM] username = nrj output = C:\filer\output

Modul (namn `GOMConfig.py` någonstans där ditt Pythonprogram hittar den — kolla upp hur man importerar moduler):

import ConfigParser def get_config(): config_path = 'C:\filer\config' config = ConfigParser.SafeConfigParser() config.read(config_path) return dict(config.items('GOM'))

Program:

import GOMConfig def main(): c = GOMConfig.get_config() print 'Hej, du heter {} och din utfil bor i "{}".'.format( c['username'], c['output']) if __name__ == '__main__': main()

Detta skulle vid körning av programmet ge output:

Hej, du heter nrj och din utfil bor i "C:\filer\output".

Jag antog här att alla konfigureringsalternativ har en enkel "key:value"-struktur så att `dict()` fungerar. Lösningen är enkelt utbyggbar. Ska det in mycket logik så är det nog smidigast att göra en klass av det hela, men det kan nog vara overkill här. Det finns utrymme att ändra exakt hur konfigurationsalternativen ska passas till det nya programmet; en dictionary är bara en av möjligheterna.

För att svara på din sista fråga så behöver en modul bara ha läsrättigheter för att fungera.

Att läsa in en rå fil och köra `exec()` på innehållet är måhända en oneliner, men det är i ärlighetens namn inte speciellt snyggt eller rekommenderat för en hållbar lösning. Dels är det ett massivt säkerhetshål (men er hotbild är nog inte så stor), och dels så finns det andra problem med felhantering som bättre löses av de färdiga modulerna för att läsa just konfigurationsfiler.

Visa signatur

Nu med kortare användarnamn, men fortfarande bedövande långa inlägg.