使用循环导入打包python

使用循环导入打包python,python,import,namespaces,Python,Import,Namespaces,我看了前面的问题,但我的情况略有不同 我有一个目录,其中包含几个python类,这些类在需要的地方相互导入。我想开始将它们打包成更小的模块,主要是为了组织。软件包的核心组件设置了一个wsgi应用程序,然后附加模块为其提供功能(到目前为止,这项工作非常有效,因为我可以在将输入连接到web应用程序之前在命令行上单独测试MOD) 我了解提供\uuuu init\uuuuu.py模块的工作原理、名称空间以及何时释放控制。我遇到的问题是,在某些情况下,模块相互导入 例如,我有一个jsonecoder,它被

我看了前面的问题,但我的情况略有不同


我有一个目录,其中包含几个python类,这些类在需要的地方相互导入。我想开始将它们打包成更小的模块,主要是为了组织。软件包的核心组件设置了一个wsgi应用程序,然后附加模块为其提供功能(到目前为止,这项工作非常有效,因为我可以在将输入连接到web应用程序之前在命令行上单独测试MOD)

我了解提供
\uuuu init\uuuuu.py
模块的工作原理、名称空间以及何时释放控制。我遇到的问题是,在某些情况下,模块相互导入

例如,我有一个jsonecoder,它被用作
cls
参数,用于对
json.dumps()
的许多调用。几乎每个文件都使用这个类。如果我将其中一些模块移动到包中的子目录中,我将如何“上一级”导入json编码器?我是否需要在每个文件中将父目录放在PYTHONPATH上?最好也给编码器提供自己的目录,并使用一个单独的_uinit__u.py文件

或者,我是否会更好地使用一个函数,该函数可以向下搜索当前工作目录下的所有目录,并将它们添加到路径中

目前包含所有代码的主目录本身不是包。。。考虑到类具有循环导入,将类迁移到子目录的最佳方法是什么

编辑:

请澄清:

我一直在开发的主要工作目录只是一个普通目录,其中包含大约10个.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

但是反过来,
项目
文件夹是否也需要一个
\uuuu init\uuuu
?使用JSONECODER的modela将如何导入它?

您可以尝试类似的方法(
root
是您的工作目录):

\uuuu init\uuuuuu.py
为空,或具有
通行证
或注释或其他内容。 然后,您可以(从
文件a.py
根目录中的任何内容)执行以下操作:


并且可以访问
文件a.py
中的
jsonecoder
。只要所有正在运行的代码都驻留在
/root
中,并且
\uuuuu init\uuuuuuuuuuuupy仅在子目录中需要,就不需要触摸
PYTHONPATH
。这种类型的目录布局非常有用,因为您可以隐藏“正常工作”的代码,并专注于需要处理的代码

您可以尝试以下操作(
root
是您的工作目录):

\uuuu init\uuuuuu.py
为空,或具有
通行证
或注释或其他内容。 然后,您可以(从
文件a.py
根目录中的任何内容)执行以下操作:


并且可以访问
文件a.py
中的
jsonecoder
。只要所有正在运行的代码都驻留在
/root
中,并且
\uuuuu init\uuuuuuuuuuuupy仅在子目录中需要,就不需要触摸
PYTHONPATH
。这种类型的目录布局非常有用,因为您可以隐藏“正常工作”的代码,并专注于需要处理的代码

答案很简单:

只需为所需的子模块使用完全限定的名称

例如,在

mybundle/test/__init__.py 
你可以接电话

import mybundle.JSONEncoder
  • 它会做正确的事情
例如,给定此模块结构:

├── mybundle
│   ├── __init__.py
│   ├── jsonencoder
│   │   ├── __init__.py
│   └── test
│       ├── __init__.py
使用中定义的文件:

[gwidion@powerpuff tmp]$ cat mybundle/__init__.py
import test

[gwidion@powerpuff tmp]$ cat mybundle/test/__init__.py
import mybundle.jsonencoder

[gwidion@powerpuff tmp]$ cat mybundle/jsonencoder/__init__.py
print 5
这项工作:

[gwidion@powerpuff 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
>>> 

答案很简单:

只需为所需的子模块使用完全限定的名称

例如,在

mybundle/test/__init__.py 
你可以接电话

import mybundle.JSONEncoder
  • 它会做正确的事情
例如,给定此模块结构:

├── mybundle
│   ├── __init__.py
│   ├── jsonencoder
│   │   ├── __init__.py
│   └── test
│       ├── __init__.py
使用中定义的文件:

[gwidion@powerpuff tmp]$ cat mybundle/__init__.py
import test

[gwidion@powerpuff tmp]$ cat mybundle/test/__init__.py
import mybundle.jsonencoder

[gwidion@powerpuff tmp]$ cat mybundle/jsonencoder/__init__.py
print 5
这项工作:

[gwidion@powerpuff 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
>>> 

“我有一个包含几个python类的目录”。这是不明智的。目录包含文件。目录也可以是Python包。文件是模块。模块包含类定义。你能澄清一下你的问题吗?@S.Lott编辑了一个例子“我有一个包含几个python类的目录”。这是不明智的。目录包含文件。目录也可以是Python包。文件是模块。模块包含类定义。请你澄清一下你的问题好吗?@S.Lott用一个示例进行了编辑因此关键的事情是在根目录中也有一个init.py,它将冒泡到子模块并执行它们的init脚本。test子目录中的init如何知道mybundle在哪里?是的,在根目录上有一个
\uuuu init\uuuu.py
是很关键的-它可以是空的(0字节)。创建一个空的
\uuuuu init\uuuuuuuuuuuuupy
会使Python将目录视为一个模块,而包含
\uuuuuuuuuuuuuuuuuuuuuuuuy.py
文件的其他目录则视为该目录的子模块。从那时起,使用导入。只要应用程序在任何情况下都能找到,它就可以工作。(并且只是根目录的名称)所以关键的事情是在根目录中也有一个init.py,它将冒泡到子模块并执行它们的init脚本。test子目录中的init如何知道mybundle在哪里?是的,在根目录上有一个
\uuuu init\uuuu.py
是很关键的-它可以是空的(0字节)。创建一个空的
\uuuuu init\uuuuuuuuuuuuupy
会使Python将目录视为一个模块,而包含
\uuuuuuuuuuuuuuuuuuuuuuuuy.py
文件的其他目录则视为该目录的子模块。从那时起,使用导入。如果你能找到