我正在尝试将'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
我的问题是为什么它不起作用以及如何解决。另一个问题是,如果您想在同一软件包中共享其他模块的一些变量,该怎么办?
让我们尝试以身作则。
假设我们具有以下目录和文件结构:
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()
执行以上操作将给出以下输出:
从a.py的init func打印语句
因此,从上面的内容,我们了解到print
from的语句__init__.py
正在执行。现在,让我们添加print(project_root)
在b.py
:
from dir_1.a import func
func()
print(project_root)
执行以上操作将导致错误提示:
...
NameError:未定义名称“ project_root”
发生这种情况是因为我们不必print
从语句中导入语句,__init__.py
而只需执行它即可。但这不是变量的情况。
让我们尝试导入变量,看看会发生什么:
from dir_1.a import func
from dir_1 import project_root
func()
print(project_root)
执行上面的文件将给出以下输出:
从a.py
/ home / user / some / directory / name / dir_1的init func打印语句
简而言之,您需要导入在__init__.py
或其他位置定义的变量才能使用它。
希望这可以帮助 : )
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句