我有一个初始化一些全局变量的Python模块;像这样的东西:
#!/usr/bin/env python
import re
"""My awesome python library."""
# A word list from the standard UNIX dictionary.
with open('/usr/share/dict/words', 'rt') as f:
WORDS_LIST = f.read().split('\n') + ['http'] + ['fubob']
# Some compiled regular expressions.
COMPILED_REG1 = re.compile("a")
COMPILED_REG2 = re.compile("b")
# Some constants.
A = 10
B = 20
def say_hello(): print('hello')
def do_something(): return 'something'
当然它可以工作,但我觉得这不是正确的方法:每次我导入这个模块时,Python都会执行它。在此示例中,它将读取文件并编译正则表达式。
我读到有些人创建了一个 config.py 文件并对其做了些什么,但我不确切知道它是如何工作的。
所以,我想知道如果你必须制作一个标准的Python库,你将如何处理这个问题。
答案 0 :(得分:6)
每次我导入这个模块时,Python都会执行它
这不正确。 Python第一次导入时,只执行一次模块全局 。然后,生成的模块对象存储在sys.modules
中,并重新用于后续导入。请参阅import
statement documenation:
一旦知道模块的名称(除非另有说明,术语“模块”将指代包和模块),搜索模块或包可以开始。检查的第一个位置是
sys.modules
,即先前导入的所有模块的缓存。如果在那里找到该模块,那么它将在导入的步骤(2)中使用。
您正在做的是正确的方法,而且正是标准Python库模块所做的。
答案 1 :(得分:0)
你这么冷。 SafeConfigParser应该无需安装
即可使用Python文件:
from ConfigParser import SafeConfigParser
try:
# Getting DB connection data from config file
parser = SafeConfigParser()
parser.read('config.txt')
dhost = parser.get('db', 'host')
ddatabase = parser.get('db', 'db')
duser = parser.get('db', 'user')
dpassword = parser.get('db', 'pw')
except Exception, err:
print str(err)
logger.error(str(err))
配置文件:
[db]
host = 179.10.13.2
db = main
user = max
pw = c45v243v5b2v6v25v6554v9
答案 2 :(得分:0)
使用config.py共享全局变量:
Python doc:how-do-i-share-global-variables-across-modules
在单个模块中跨模块共享信息的规范方法 程序是创建一个特殊的模块(通常称为config或cfg)。
只需在应用程序的所有模块中导入配置模块;该 然后,模块可用作全局名称。因为只有 每个模块的一个实例,对模块对象进行的任何更改 无处不在。
例如:
config.py:
x = 0 # Default value of the 'x' configuration setting
mod.py:
import config
config.x = 1
main.py:
import config
import mod
print config.x