我有主脚本文件,让我们称之为main.py,我有模块文件位于子目录" module /",让我们称之为mod.py (模块/ mod.py)
目录树是这样的:
-main.py
-module/
|
|---mod.py
现在我在main.py中有一个全局变量,称之为" a"并且它等于1。 我在mod.py中有一个函数,它应该打印全局变量a。
main.py:
import sys
sys.path.append("module/")
from mod import *
global a
a = 1
print_it()
模块/ mod.py:
from main import *
def print_it():
global a
print a
当我启动main.py脚本时,我得到:
NameError:name' print_it'未定义
为什么?
答案 0 :(得分:1)
对于导入部分: 目录树应如下所示:
-main.py
-module/
|
|---__init__.py
|---mod.py
__init__.py
文件可以为空,在3.x中不需要
如果你按照下面的方法使用global,你可以像这样导入你的方法。
from mod import print_it
您可以创建一个新的模块Common / Global(无论您想要命名它),而不是使用全局变量,如下所示:
class Common:
pass
common = Common()
common.a = 0
然后将其导入模块
from Common import common
您将可以访问所有模块中的common.a
,并且不会使用全局变量污染您的命名空间。
这是一个例子:
如上定义的Common.py。
mod.py如下:
from Common import common
def printa():
print common.a
和main.py:
from Common import common
from mod import printa
printa()
common.a = 10
printa()
答案 1 :(得分:0)
尝试提供模块文件夹的完整路径。如果您在远程计算机上运行它,则可以使用 os 模块来获取绝对路径。
import sys
from os import path as expath
sys.path.append(os.path.abspath(r'module/'))
希望它有所帮助。快乐编码:)
答案 2 :(得分:0)
基本上发生的事情是main.py
从mod.py
导入所有内容。在那一刻,python将从mod.py
逐行执行,但mod.py
的第一行再次从main.py
导入所有内容。所以现在python将再次执行main.py
行的行。由于先前已导入mod.py
,因此python不会再返回mod.py
并继续行直到它到达print_it()
,此时尚未定义mod.py
,因为{{由于mod.py
中的import语句,1}}尚未完全执行。
这个answer用一些很好的例子解释了同样的想法。