【问题标题】:importing modules in python from different folders从不同文件夹导入python中的模块
【发布时间】:2016-05-19 09:32:33
【问题描述】:

我有主脚本文件,我们称之为 main.py,我有位于子目录“module/”中的模块文件,我们称之为 mod.py (module/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' 未定义

为什么?

【问题讨论】:

  • 因为module/文件夹中没有main.py文件
  • 这行不通。在main 中导入mod,在mod 中再次导入main。问题就在这里。 mod 未完全导入。而print_it 直到没有被创建。
  • 将main.py: from mod import * 中的这一行更改为import mod 会发生什么?
  • 你用的是什么版本的python? 3.x 还是 2.x ?模块导入不是这些版本之间的名称

标签: python python-import python-module


【解决方案1】:

对于导入部分: 目录树应如下所示:

-main.py

-module/
 |
 |---__init__.py
 |---mod.py

__init__.py 文件可以为空,在 3.x 中不需要 如果你按照下面的方法使用全局,你可以像这样导入你的方法。

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()

【讨论】:

  • @Tadhg McDonald-Jensen:确实如此,你可以在 main 中使用 common.a 定义它,然后在 print_it 中使用它,它包含在另一个模块中,而不知道变量是否在定义或一开始没有。
  • 好的...但是如果它没有被定义那么你会遇到问题,它仍然没有解决print_a没有被定义的问题。
  • 仍然没有解决print_a 函数未定义的问题。
  • 我还在等OP回答他用的是哪个版本的python,2.x和3.x的导入系统不一样
  • this part 就我而言是完全相同的。无论如何,我同意一些共同点是一个好主意,因此我赞成,但我真的认为你可以通过至少解决 OP 遇到的问题来改进这一点,而不是简单地提出一个完全不同的替代方案。
【解决方案2】:

尝试提供模块文件夹的完整路径。如果你在远程机器上运行它,你可以使用 os Module 来获取绝对路径。

import sys
from os import path as expath
sys.path.append(os.path.abspath(r'module/'))

希望对您有所帮助。快乐编码:)

【讨论】:

    【解决方案3】:

    基本上发生的事情是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 中的导入语句而执行。

    answer 这个answer 用一些很好的例子解释了同样的想法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-18
      • 2013-08-26
      • 1970-01-01
      • 2018-08-08
      • 1970-01-01
      相关资源
      最近更新 更多