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

约翰·尤尔

我正在尝试将'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

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

阿米特·亚达夫(Amit Yadav)

让我们尝试以身作则。

代码和目录说明:

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

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打印语句

因此,从上面的内容,我们了解到printfrom语句__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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么 mpl_connect 在类的 __init__ 中调用时不起作用?

为什么__init__在python中失败

__all__ 在 __init_.py 中不起作用以允许特定模块导入我的 Python 代码

为什么/ copy在ILE模块中不起作用

为什么重写模块在.htaccess中不起作用

为什么我不能从类外部访问 __init__ 中定义的类变量?

为什么 super().__init__() 不起作用?面向对象编程

为什么我的Terraform输出在模块中不起作用?

Git Directory Diff在我的子模块中不起作用

ansible 我的 sql 模块在 Windows Server 中不起作用

我在yii中的登录模块不起作用

模块调用模块不起作用。为什么?

为什么在多次继承中执行Base .__ init __(self)而不是super().__ init __()时会跳过__init__?

为什么Shader在html5模块中不起作用,而在桌面应用程序中起作用?

为什么错误处理在 repl 中不起作用,但在 VSCode 中起作用?不和谐.py

为什么我的多模块Maven项目中的模块不起作用?

为什么文本修饰在我的代码中不起作用?

为什么我在 JavaScript 中的 onclick 事件不起作用?

为什么我在构造函数中的绑定不起作用?

为什么我的断言在IntelliJ中不起作用?

为什么我的 scanf 在函数中不起作用?

为什么XPath count()在PHP中对我不起作用?

为什么我在Android中的按钮不起作用?

为什么classOf [T]在我的对象中不起作用?

为什么我的别名在Zsh中不起作用?

为什么我的 RaisedButton 在 Flutter 中不起作用?

为什么符号“&”在我的scss代码中不起作用?

为什么[if ...]条件在我的html中不起作用?

设置nofoldenable在我的vim中不起作用-为什么?