0

I want to use a configuration file in the middle of my main Python script. In this file, there are variables already initialized in the main script.

Main script:

# -*- coding: utf-8 -*-

import imp
import optparse
from time import strftime, strptime
from datetime import date, timedelta

[...]

date_mois = date_de_ref.strftime("%m")
date_annee = date_de_ref.strftime("%Y")
date_moins2j = (date_de_ref - timedelta(days=2)).strftime("%d/%m/%Y")
date_moins7j = (date_de_ref - timedelta(days=7)).strftime("%d/%m/%Y")

imp.load_source("conf_file", "part_1.config")
import conf_file

for task in conf_file.list_tasks:
    print task[1]

print "The end!"

"part_1.config":

list_tasks = [
    ["B", "BAT001", "Info batch 1"],
    ["B", "BAT002 DEBUT=21/01/2015", "Info batch 2"],
    ["B", "BAT003 FIN=" + date_moins2j, "Info batch 3"],
]

If I executed it like this, I got:

Traceback (most recent call last):
  File "ordo_na.py", line 48, in <module>
    imp.load_source("conf_file", "part_1.config")
  File "part_1.config", line 9, in <module>
    ["B", "BAT003 FIN=" + date_moins2j, ""],
NameError: name 'date_moins2j' is not defined

I tried it with:

import ordo_na

list_tasks = [
    ["B", "BAT001", ""],
    ["B", "BAT002 DEBUT=21/13/12", ""],
    ["B", "BAT003 FIN=" + ordo_na.date_moins2j, ""],
]

The main script seems to be executed twice this way.

How can I use variable from the main script in my configuration file ?
I want to avoid the import ordo_na line if possible and keep the configuration file the cleansest possible.

I use Python 2.6.6 by the way (I can't upgrade to a newer version).

Thanks!

1
  • 1
    The first problem is that you are actually importing a python script not reading a config file. Your config file should be one of ini/json/text/pickle file format. - The really bad news is that if someone inserts some malicious python in that file your file will execute it. Commented Mar 8, 2015 at 10:48

1 Answer 1

2

Modules are separate, and you can't easily access the variables of the importing module from the imported module (what I think you're trying to do).

Consider:

part_1.config

def get_tasks(date_moins2j):

    list_tasks = [
        ["B", "BAT001", ""],
        ["B", "BAT002 DEBUT=21/13/12", ""],
        ["B", "BAT003 FIN=" + date_moins2j, ""],
    ]

    return list_tasks

Main Script

import imp

imp.load_source("conf_file", "part_1.config")
import conf_file

print( conf_file.get_tasks("foo") )

Alternatively, you could just rename part_1.config to something like my_config.py, then simply use import:

Main Script

import my_config as conf_file

pprint.pprint( conf_file.get_tasks("foo") )

If you didn't want to deal with explicitly passing arguments, you could always pass the importing module's (main script) global dictionary, and access that, then your files would look like:

part_1.config

def get_tasks(g):

    list_tasks = [
        ["B", "BAT001", ""],
        ["B", "BAT002 DEBUT=21/13/12", ""],
        ["B", "BAT003 FIN=" + g['date_moins2j'], ""],
    ]

    return list_tasks

Main Script

import imp

imp.load_source("conf_file", "part_1.config")
import conf_file

date_moins2j = "foo"

pprint( conf_file.get_tasks(globals()) )
Sign up to request clarification or add additional context in comments.

1 Comment

Thanks for answering the question! I finally wrote my script again using JSON config files like suggested by @SteveBarnes.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.