我有这个基本的项目结构
/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
但如果没有它我怎么能做到?
答案 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