我有一个名为spellnum
的模块。它可以用作命令行实用程序(它有if __name__ == '__main__':
块),也可以像标准Python模块一样导入。在
模块定义了一个名为Speller
的类,如下所示:
class Speller(object):
def __init__(self, lang="en"):
module = __import__("spelling_" + lang)
# use module's contents...
如您所见,类构造函数在运行时加载其他模块。这些模块(spelling_en.py
,spelling_es.py
等)与spellnum.py
本身位于同一目录中。在
除了spellnum.py
,还有其他具有实用函数和类的文件。我想隐藏这些文件,因为我不想将它们暴露给用户,而且用随机文件污染Python的lib目录是个坏主意。据我所知,实现这一点的唯一方法是创建一个包。在
我为这个项目设计了这个布局(灵感来自这个伟大的tutorial):
^{pr2}$文件__init__.py
包含一行:
from spellnum import Speller
考虑到这种新布局,动态模块加载的代码必须更改:
class Speller(object):
def __init__(self, lang="en"):
spelling_mod = "spelling_" + lang
package = __import__("spellnum", fromlist=[spelling_mod])
module = getattr(package, spelling_mod)
# use module as usual
因此,使用此项目布局a可以执行以下操作:
在example.py
中成功地import spellnum
,并像使用一个简单的模块一样使用它:
# an excerpt from the example.py file
import spellnum
speller = spellnum.Speller(es)
# ...
import spellnum
并从项目根目录运行这些测试,如下所示:
$ PYTHONPATH="`pwd`:$PYTHONPATH" python test/test_spellnum.py
我不能用新布局直接执行spellnum.py
。当我尝试时,它显示以下错误:
Traceback (most recent call last):
...
File "spellnum/spellnum.py", line 23, in __init__
module = getattr(package, spelling_mod)
AttributeError: 'module' object has no attribute 'spelling_en'
如何组织模块所需的所有文件,以便用户能够从命令行和Python代码中使用模块,最好的方法是什么?在
谢谢!在
{cd1>怎么样?在
您的问题是,包的调用与您要执行的python文件相同,因此导入
将尝试从文件而不是包导入。您可以摆弄相对导入,但我不知道如何使它们与
^{pr2}$__import__
一起工作,因此我建议如下:相关问题 更多 >
编程相关推荐