为什么我的__init__.py在模块中不起作用?

时间:2019-10-22 10:04:09

标签: python python-3.x

我正在尝试将'project_root'添加到__init__.py中,所有模块都可以使用它,但是它不起作用。

环境:Python 3.7.0 MACOS MOJAVE

文件结构

·
├── __init__.py
└── a.py

__init__.py文件中的代码:

import sys

project_root = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
sys.path.append(project_root)

和另一个文件

print(project_root)

如果我在同一目录中运行python a.py,或者在目录外运行python a.py,则错误如下:

Traceback (most recent call last):
  File "a.py", line 1, in <module>
    print(project_root)
NameError: name 'project_root' is not defined

我的问题是为什么它不起作用以及如何解决。 另一个问题是,如果要在同一软件包中共享其他模块的某些变量,该怎么办?

2 个答案:

答案 0 :(得分:1)

让我们尝试通过示例来理解。

代码和目录说明:

假设我们具有以下目录和文件结构:

dir_1
    ├── __init__.py
    └── a.py
b.py

__init__.py包含:

import sys,os

# Just to make things clear
print("Print statement from init")

project_root = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
sys.path.append(project_root)

a.py包含:

def func():
    print("func from a.py")

让我们开始导入东西:

假设您首先在b.py中添加以下代码:

from dir_1.a import func

func()

执行上述操作将给出以下输出:

  

从init打印语句
  来自a.py的功能

因此,从以上所述,我们了解到print的{​​{1}}语句正在执行。现在,让我们在__init__.py中添加print(project_root)

b.py

执行上述操作将导致错误提示:

  

...
  NameError:名称“ project_root”未定义

发生这种情况是因为我们不必从from dir_1.a import func func() print(project_root) 导入print语句,而只需执行它即可。但这不是变量。

让我们尝试导入变量,看看会发生什么:

__init__.py

执行上述文件将给出以下输出:

  

从init打印语句
  来自a.py的功能
  / home / user / some / directory / name / dir_1

长话短说,您需要导入from dir_1.a import func from dir_1 import project_root func() print(project_root) 中定义的变量  或其他任何地方以便使用它。

希望这会有所帮助:)

答案 1 :(得分:0)

您必须导入变量:

from dir import project_root

其中dir是您所在的目录