在python中导入

时间:2013-07-29 16:04:05

标签: python

我有这个基本的项目结构

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

没有!我希望从app.py中的 com_auth 导入一些变量。

我尝试这样做

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

但它当然不起作用。

是的,我知道,我可以这样做

/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

但如果没有它我怎么能做到?

4 个答案:

答案 0 :(得分:4)

简短回答:不要这样做!无论您需要从app.py知道什么值,请将其作为函数参数提供给com_auth.py中的任何内容。其他所有东西都会通过迟早遇到循环依赖来搞乱你的程序。尽量保持子模块尽可能独立。

答案 1 :(得分:1)

我会创建一个包,请参阅文档here

类似于:

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.py中使用com_auth中的变量,您宁愿将com_auth导入到app.py文件中,然后可以访问com_auth中的函数,类等。来自app.py内的{1}}:

from yourpackage.components import com_auth

i = 5
result = com_auth.yourfunction(i)

答案 2 :(得分: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中。

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

答案 3 :(得分:0)

将其添加到主文件中。

import sys
sys.path.append('..')
from app import var