从不同的文件夹导入python中的模块

时间:2016-05-19 09:32:33

标签: python python-import python-module

我有主脚本文件,让我们称之为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'未定义

为什么?

3 个答案:

答案 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.pymod.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用一些很好的例子解释了同样的想法。