Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么我的uuu init_uuuuuuuuuuy.py不';你不能在模块里工作吗?_Python_Python 3.x - Fatal编程技术网

Python 为什么我的uuu init_uuuuuuuuuuy.py不';你不能在模块里工作吗?

Python 为什么我的uuu init_uuuuuuuuuuy.py不';你不能在模块里工作吗?,python,python-3.x,Python,Python 3.x,我正在尝试将“project\u root”添加到\uu init\uuuuuuuuupy中,所有模块都可以使用它,但它不起作用 环境:Python 3.7.0 MACOS MOJAVE 文件结构 · ├── __init__.py └── a.py \uuuu init\uuuuu.py文件中的代码: import sys project_root = os.path.dirname(os.path.dirname(os.path.realpath(__file__))) sys.path

我正在尝试将“project\u root”添加到
\uu init\uuuuuuuuupy
中,所有模块都可以使用它,但它不起作用

环境:Python 3.7.0 MACOS MOJAVE

文件结构

·
├── __init__.py
└── a.py
\uuuu init\uuuuu.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
回溯(最近一次呼叫最后一次):
文件“a.py”,第1行,在
打印(项目根目录)
NameError:未定义名称“project\u root”
我的问题是为什么它不工作以及如何修复它。
另一个问题是,如果要在同一个软件包中共享其他模块的一些变量,该怎么办?

您必须导入变量:

from dir import project_root

其中dir是您所在的目录

让我们试着通过示例来理解

代码和目录说明: 假设我们有以下目录和文件结构:

dir_1
    ├── __init__.py
    └── a.py
b.py
\uuuu init\uuuu.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)

def func():
    print("func from a.py")
a.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)

def func():
    print("func from a.py")
让我们开始导入东西: 假设您首先在
b.py
中拥有以下代码:

from dir_1.a import func

func()
from dir_1.a import func

func()
print(project_root)
执行上述操作将得到以下输出:

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

因此,从上面我们了解到,
\uu init\uuuuuuuuupy
中的
print
语句正在执行。现在,让我们在
b.py
中添加
print(project\u root)

from dir_1.a import func

func()
from dir_1.a import func

func()
print(project_root)
执行上述操作将导致出现以下错误:


NameError:未定义名称“project\u root”

发生这种情况是因为我们不必从
\uuu init\uuuuuuuupy
导入
print
语句,只需执行它即可。但变量的情况并非如此

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

from dir_1.a import func
from dir_1 import project_root

func()
print(project_root)
执行上述文件将提供以下输出:

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

长话短说,您需要导入
\uuuu init\uuuu.py
或者其他任何地方使用它


希望这能有所帮助:)

不清楚您为什么认为这会起作用。在
\uuuu init\uuuuu.py
中声明变量不会使其在目录中的每个其他文件的作用域中。我建议大家阅读,例如…@jornsharpe谢谢,我会先看一下链接。我想这样做是因为我不想在每个文件中定义
project\u root
。为什么要在每个文件中定义
project\u root
,我得到了错误``回溯(最近一次调用上次):文件“a.py”,第1行,来自tmp导入项目_rootmodulenofoundError:没有名为“tmp”的模块``谢谢@Amit Yadav,我理解你的例子。因此,如果我想在包(dir中的文件)中使用
project\u root
参数,
\uuuu init\uuuuu.py
不起作用,因为当我在目录中执行文件时,它不会被执行。