2012-01-12 56 views
1

包装蟒蛇我通过前面的问题,这个效果看,但我的情况略有不同...圆形进口

我有一个包含进口彼此在这里和那里必要几个Python类目录。我想开始将它们打包成更小的模块,主要是为了组织目的。该软件包的核心组件设置了一个wsgi应用程序,然后额外的模块为其提供了功能(迄今为止,该功能运行良好,因为我可以在命令行上单独测试这些mod,然后将其输入连接到Web应用程序。)

我了解如何提供__init__.py模块,其命名空间以及何时释放控制权。我遇到的问题是某些情况下的模块相互导入。

例如,我有一个JSONEncoder,用作cls参数,用于json.dumps()的许多调用。这个类实际上用于每个文件。如果我将这些模块中的某些模块移动到程序包中的子目录中,我将如何去“导入一个级别”来导入json编码器?我需要将父目录放在每个文件的PYTHONPATH中吗?编码器自己的目录以及单独的__init__.py文件会更好吗?

另外,我是否最好放入一个函数来钻取当前工作目录下的所有目录,并将它们添加到路径中?

目前包含所有代码的主目录本身没有打包......考虑到它们具有循环导入,将类像类迁移到子目录的最佳方法是什么?

编辑:

对于澄清:

我一直在开发的主要工作目录只是包含大约十.py文件,它们都含有与像它们的文件名的名字班定期目录。目前整个事情只是.py文件的git repo。

-project 
    search.py 
    jsonencoder.py 
    webapp.py 
    modela.py 
    modelb.py 
    modelc.py 

名称当然是例如目的。

现在据我所知(这可能是完全错误的)明智的做法是将这些模型打包在一起,对吗?

-project 
    search.py 
    jsonencoder.py 
    webapp.py 
    -models 
    __init__.py 
    modela.py 
    modelb.py 
    modelc.py 

但后来反过来又会在project文件夹需要一个__init__吗?使用jsonencoder的modela将如何导入它?

+0

“我有一个包含多个python类的目录“。这不明智。目录包含文件。目录也可以是Python包。文件是模块。模块包含类定义。你能澄清你的问题吗? – 2012-01-12 20:22:51

+0

@ S.Lott编辑示例 – DeaconDesperado 2012-01-12 20:33:40

回答

1

答案很简单:

只需要使用完全合格的名称,你需要

例如,子模块,在

mybundle/test/__init__.py 

你可以有行

import mybundle.JSONEncoder 
  • 它会做j最好的东西。

例如,假设该模块结构:

├── mybundle 
│   ├── __init__.py 
│   ├── jsonencoder 
│   │   ├── __init__.py 
│   └── test 
│    ├── __init__.py 

与定义为文件:

[[email protected] tmp]$ cat mybundle/__init__.py 
import test 

[[email protected] tmp]$ cat mybundle/test/__init__.py 
import mybundle.jsonencoder 

[[email protected] tmp]$ cat mybundle/jsonencoder/__init__.py 
print 5 

这工作:

[[email protected] tmp]$ python 
Python 2.7.1 (r271:86832, Apr 12 2011, 16:15:16) 
[GCC 4.6.0 20110331 (Red Hat 4.6.0-2)] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import mybundle 
5 
>>> 
+0

因此,关键的是在根中也有一个__init__.py,它也会冒泡到子模块并执行它们的init脚本。测试子目录中的init如何知道mybundle在哪里? – DeaconDesperado 2012-01-12 20:37:32

+0

是的,在根上有一个'__init __。py'是至关重要的 - 它可以是空的(0字节)。创建一个空的'__init __。py'会使Python将该目录视为一个模块,并将包含'__init __。py'文件的其他目录视为该子目录的子模块。从此,使用进口只是工作,如果可以在任何应用程序中找到。 (并且只是您的根目录的名称) – jsbueno 2012-01-12 23:31:33

0

你可以尝试这样的事情(root是你的工作目录):

/root 
    - file_a.py 
    - file_b.py 
    /JSONEncoder 
    - __init__.py 
    - JSONEncoder.py 

__init__.py是空白的,或者具有pass评论或东西。 然后,您可以做(从file_a.py或任何在root):

from JSONEncoder import JSONEncoder 

,并在file_a.py访问JSONEncoder。只要您的所有运行代码位于/root__init__.py只需要在子目录中,则不需要触摸PYTHONPATH。这种类型的目录布局非常有用,因为您可以隐藏“正常工作”的代码并专注于您需要处理的代码。