我正在尝试将'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
我的问题是为什么它不起作用以及如何解决。 另一个问题是,如果要在同一软件包中共享其他模块的某些变量,该怎么办?
答案 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是您所在的目录