我的views
目录有以下结构。
views
|--__init__.py
|--a_management.py
|--b_management.py
|--c_management.py
|--d_management.py
|--e_management.py
和__init__.py
从以下内容开始:
from a_management import *
from b_management import *
from c_management import *
from d_management import *
from e_management import *
.........
...etc...
.........
在每个文件中{a_management.py
,b_management.py
...)我需要编写相同的代码导入模块:
import sys,os
from django.shortcuts import render, redirect
from django.http import HttpResponseRedirect
.........
...etc...
.........
是否可以仅在__init__.py
执行所有模块导入?
当我尝试时,似乎仍未找到导入,我收到如下错误:NameError: global name 'sys' is not defined
答案 0 :(得分:3)
如果每个management
模块都需要访问sys
,那么他们都必须导入它。没办法解决这个问题。 (而且,如果他们都需要它,那么他们所有应该导入它。这不是一件坏事。)
您可以通过__init__
导入sys
,os
以及需要其他任何内容来保存一些输入,然后每个management
模块都可以执行{{1} },因此"继承"来自from __init__ import *
的所有导入模块。
嗯,除非你不能这样做,因为__init__
已经从__init__
模块中导入了东西,所以上面的建议会导致循环导入,这是一个没有 - 号
我不知道您的应用程序的具体细节,但我必须相信有更好的方法来组织您的模块以避免重复导入,特别是使用{{1} }。通常你想尽可能少地使用它。
答案 1 :(得分:2)
使用共享脚本执行所有系统导入怎么样?
顺便说一句,我同意import *
不是最好的主意。我使用导入程序是有道理的,但我不太确定你的常规设置。此外,您需要注意循环导入。
所以,我的回答是专门针对我需要编写相同的代码导入模块:,而不是针对整个设置是否有意义。
概念验证,导入程序是您真正关心的。:
├── pack
│ ├── __init__.py
│ ├── importer.py
│ ├── mgmt_1.py
│ ├── mgmt_2.py
└── test.py
<强> test.py 强>
import pack
pack.foo_1()
pack.foo_2()
<强> init.py 强> 来自mgmt_1 import * 来自mgmt_2 import *
<强> mgmt_1.py 强>
from .importer import *
print "sys", sys
print "os", os
def foo_1():
print "foo_1"
<强> mgmt_2.py:强>
from .importer import *
print "sys", sys
print "os", os
def foo_2():
print "foo_2", dir(sys)[0:5]
<强> importer.py 强>
import sys
import os
输出:
sys <module 'sys' (built-in)>
os <module 'os' from '/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/os.pyc'>
sys <module 'sys' (built-in)>
os <module 'os' from '/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/os.pyc'>
foo_1
foo_2:sys ['__displayhook__', '__doc__', '__excepthook__', '__name__', '__package__']