当包是目录而不是文件时,如何"导入*"并调用导入的函数

jco*_*ctx 0 python import client-server packages package

如果我正在开发一个客户端 - 服务器应用程序并且有3个文件(client.py,server.pycommon.py,)并且common.py具有有用的功能(例如normalize()),那么客户端和服务器都可以轻松地执行以下操作:

from common import *

url = normalize(url)
Run Code Online (Sandbox Code Playgroud)

但是,如果出于各种奇怪的原因,我宁愿拥有单独的子目录(client,servercommon),并且每个函数都有自己的文件,似乎没有类似的快捷方式.

我必须摆弄sys.path,然后在导入后我需要使用url=normalize.normalize(url).我确信我可以编写一个解决方法,但是我已经不知道有一些Pythonic处理这种方法吗?

更新:以下是按照Ignacio的建议完成后的方法:

$ cat common/__init__.py; client/login.py jcomeauictx.myopenid.com
import os, sys
for module in os.listdir(os.path.dirname(__file__)):
 print >>sys.stderr, 'module: %s' % module
 name, extension = os.path.splitext(module)
 if extension == '.py' and not name.startswith('_'):
  importer = 'from %s import %s' % (name, name)
  print >>sys.stderr, 'import statement: %s' % importer
  exec(importer)
Run Code Online (Sandbox Code Playgroud)

结果:

module: __init__.py
module: normalize.py
import statement: from normalize import normalize
module: __init__.pyc
module: normalize.pyc
('http://www.myopenid.com/server', 'http://jcomeauictx.myopenid.com/')
Run Code Online (Sandbox Code Playgroud)

Ign*_*ams 5

__init__.py目录导入中的任何内容都将被导入,import *前提是它不受限制__all__.