-2

i have this basic project structure

/components/__init__.py
/components/com_auth.py
/app.py 

No! I want import some varible from app.py in com_auth.

I trying do like this

/components/__init__.py
/components/com_auth.py
/__init__.py
/app.py 

But it, of course, not work.

Yes, i know, that i can do it like this

/app.py
/app/__init__.py                   <<<< there i containg varible
/app/components/__init__.py
/app/components/parent.py
/app/components/__init__.py
/app/components/com_auth.py

But how i can do it without it?

4

4 回答 4

4

简短的回答:不要这样做!无论您需要从中了解什么值app.py,都可以将其作为函数参数提供给您在 中所做的任何事情com_auth.py。其他一切迟早都会因为循环依赖而弄乱你的程序。尽量使子模块保持独立。

于 2013-07-29T16:12:28.857 回答
1

您必须确保它app.py在您的PYTHON PATH.

如果直接执行python component/com_auth,则上层目录不在PYTHON PATH(只有当前脚本的目录会自动添加到系统中),因此无法导入PYTHON PATH上层模块如。app.py

您的问题有两种解决方案。

快速而肮脏的(我懒惰时仍然使用它,效果很好),它可以手动将其添加到PYTHON PATH

import sys
import os

sys.path.append(os.path.dirname(os.path.realpath(__file__)))

然而,正确的解决方案是始终确保程序的入口点位于顶层目录。意义com_auth永远不应该直接运行,而总是从一个模块从一个模块从一个模块...从根目录导入。在那里你通过做python point_of_entry.py和从不运行你的代码python sub_module/any_other_module.py。在你的情况下,可能app.py.

在不可能或不可取的情况下(管理命令、单元测试等),您应该有一个脚本,其中包含向 PYTHON PATH 添加目录的选项(这就是 django-admin、nosetest 等所做的)。

我怀疑你只是在测试你的模块,只想快速运行它。在这种情况下,只需输入:

PYTHONPATH='/path/to/your/project'

在您的 shell 中,它将被添加到当前会话的 PYTHON PATH 中。

您可以稍后修复您的架构。

于 2013-07-29T16:22:14.533 回答
1

我会创建一个包,请参阅此处的文档。

所以像:

yourpackage/                          # Top-level package
      __init__.py                     # Initialize the package
      app.py
      components/                     # Subpackage
              __init__.py
              com_auth.py

然后,您可以从包中的任何位置访问每个模块,例如:

from yourpackage.components import com_auth
from yourpackage import app

要使用app.pyin 中的变量com_auth,您宁愿导入com_auth文件,然后让您从app.pyinside 访问函数、类等:com_authapp.py

from yourpackage.components import com_auth

i = 5
result = com_auth.yourfunction(i)
于 2013-07-29T16:20:28.547 回答
0

将此添加到主文件。

import sys
sys.path.append('..')
from app import var
于 2013-07-29T16:16:37.833 回答