使用Python文档中的结构:
sound/
__init__.py
effects/
__init__.py
echo.py
surround.py
reverse.py
说我想要import sound.effects
并获取可用效果列表。我可以通过在sound.effects
中声明模块级变量然后在导入每个.py文件时附加到它来执行此操作。声音/效果/ __ init__.py可能如下所示:
effectList = []
import echo
import surround # Could write code to import *.py instead
...
从我的主要代码我现在可以访问sound.effects.effectList
以获取效果列表,但如何从echo.py中访问effectList
来进行实际追加?我一直试图访问变量:
# None of these work :-(
# from . import self
# from .. import effects
# import sound.effects
sound.effect.effectList.append({'name': 'echo'})
答案 0 :(得分:6)
在这种情况下,人们通常会在模块中创建一个common.py文件。
sound/
__init__.py
effect/
__init__.py
common.py
echo.py
surround.py
reverse.py
然后将代码从__init__.py
移至common.py
:
effectList = []
import echo
import surround # Could write code to import *.py instead
...
在__init__.py
内你有这个:
from common import *
所以现在在echo.py
你有这个:
import common
common.effectList.append({'name': 'echo'})
导入声音的任何东西都会像这样使用它
import sound.effect
for effect_name,effect in sound.effect.effectlist.items():
#....
我自己刚刚开始使用它,但我相信这是python社区的常见做法。
答案 1 :(得分:2)
我认为您应该将“提供”留给__init__.py
包内的effects
,而不是让所有模块自动填充effectList
。我能想到的几个原因。
effectList
之外)。 import *.py
中实现了__init__.py
之类的东西会更好,它会在当前目录中加载所有内容并使其可用。 __init__.py
中的此类内容。
import os, glob
effectslist = []
for i in glob.glob("*.py"):
if i == "__init__.py":
next
print "Attempting to import %s"%i
try:
mod = __import__(os.path.splitext(i)[0])
effectslist.append(mod)
except ImportError,m:
print "Error while importing %s - %s"%(i,m)