【问题标题】:Use variables of main Python script in a config file在配置文件中使用主要 Python 脚本的变量
【发布时间】:2015-03-08 10:26:09
【问题描述】:

我想在我的主要 Python 脚本中间使用一个配置文件。 在这个文件中,有一些变量已经在主脚本中初始化了。

主脚本:

# -*- 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"],
]

如果我这样执行,我得到:

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

我试过了:

import ordo_na

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

主脚本好像这样执行了两次。

如何在配置文件中使用主脚本中的变量?
如果可能,我想避免使用import ordo_na 行,并尽可能保持配置文件最干净。

顺便说一下,我使用的是 Python 2.6.6(我无法升级到更新的版本)。

谢谢!

【问题讨论】:

  • 第一个问题是你实际上是在导入一个python脚本而不是读取一个配置文件。您的配置文件应该是 ini/json/text/pickle 文件格式之一。 - 真正的坏消息是,如果有人在该文件中插入一些恶意 python,您的文件将执行它。

标签: python variables import configuration-files


【解决方案1】:

模块是独立的,您无法从导入的模块轻松访问导入模块的变量(我认为您正在尝试这样做)。

考虑:

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

主脚本

import imp

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

print( conf_file.get_tasks("foo") )

或者,您可以将part_1.config 重命名为my_config.py,然后只需使用import

主脚本

import my_config as conf_file

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

如果您不想处理显式传递参数,您始终可以传递导入模块的(主脚本)全局字典并访问它,那么您的文件将如下所示:

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

主脚本

import imp

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

date_moins2j = "foo"

pprint( conf_file.get_tasks(globals()) )

【讨论】:

  • 感谢您回答问题!我终于再次使用 @SteveBarnes 建议的 JSON 配置文件编写了我的脚本。
猜你喜欢
  • 2015-10-04
  • 2020-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多