我无法理解 python3 中的导入
I'm having trouble understanding importing in python3
我查看了许多网站和许多相关问题,但遵循这些问题的解决方案似乎仍然无济于事。我想也许我遗漏了什么,所以开始吧。
我的项目是创建一个 DM 工具来管理 table 顶级角色扮演游戏。我需要能够将我的项目拆分成许多不同的文件,以保持一切井井有条。 (到目前为止)我只有三个文件要处理。我有一个名为 dmtool.py3
的主文件,我有一个名为 classdef.py3
的 class 定义文件,还有一个名为 races.py3
的用于创建比赛对象的文件。
1] 我的第一个问题是关于导入单个文件。我试过用几种不同的方式组织文件,因此假设我的三个文件都在同一个目录中。
如果我想将我的 class 定义从 classdef.py3 导入到我的主文件 dmtool.py3 中,我该怎么做? import classdef
和 import classdef.py3
似乎无法正常工作,说它们没有同名模块。
2] 于是我做了一个模块,好像可以用。为此,我创建了一个名为 defs
的子目录,并将 classdef.py3 和 races.py3 文件放入其中。我创建了 __init__.py3
文件,并将 import defs
放入 dmtool.py3
。作为测试,我将 x = 1
放在 races.py3
的最顶部,并将 print("X =", defs.x)
放在 dmtool.py3
中。我收到一条错误消息,指出该模块没有属性 x.
所以我想我的第二个问题是是否可以只使用来自其他文件的变量。我会使用 defs.x
或 defs.races.x
或 races.x
还是简单地使用 x
?我似乎找不到有效的方法。我需要弄清楚这一点,因为我将使用 races.py3
文件中定义的 class 的特定实例。
3] 我的第三个问题是前两个问题的一个简单问题。现在 races.py3
和 classdef.py3
在同一个模块中,我如何让一个访问另一个。 races.py3
必须使用 classdef.py3
中定义的 classes。
如果有任何帮助,我将不胜感激。就像我说的,我尝试查找与导入相关的其他问题,但他们的简单解决方案似乎出现了同样的错误。我没有 post 我的特定文件,因为除了我提到的以外,只有非常简单的打印行或 class 定义。没有什么会影响进口。
谢谢,
克里斯
启动 python 并输入这些命令:
>>> import sys
>>> sys.path
路径是 python 查找库的目录列表。如果您的模块不在列表中,则会找到 none。
首先,不要使用.py3
作为文件扩展名。 Python不认识
Python 3的导入系统其实很简单。 import foo
在 sys.path
中查找名为 foo 的包(目录)或模块(.py
文件)。
sys.path
包含您通常安装库的各种标准目录,以及 Python 标准库。 sys.path
的第一个条目通常是 __main__
脚本所在的目录。如果您将 Python 调用为 python -m foo.bar
,第一个条目将改为包含 foo
包的目录。
相对导入使用不同的语法:
from . import foo
这意味着 "import the foo
module or package from the package which contains the current module." 它在 PEP 328 中有详细讨论,如果您不想为每个导入指定包的整个结构,这可能很有用。
我查看了许多网站和许多相关问题,但遵循这些问题的解决方案似乎仍然无济于事。我想也许我遗漏了什么,所以开始吧。
我的项目是创建一个 DM 工具来管理 table 顶级角色扮演游戏。我需要能够将我的项目拆分成许多不同的文件,以保持一切井井有条。 (到目前为止)我只有三个文件要处理。我有一个名为 dmtool.py3
的主文件,我有一个名为 classdef.py3
的 class 定义文件,还有一个名为 races.py3
的用于创建比赛对象的文件。
1] 我的第一个问题是关于导入单个文件。我试过用几种不同的方式组织文件,因此假设我的三个文件都在同一个目录中。
如果我想将我的 class 定义从 classdef.py3 导入到我的主文件 dmtool.py3 中,我该怎么做? import classdef
和 import classdef.py3
似乎无法正常工作,说它们没有同名模块。
2] 于是我做了一个模块,好像可以用。为此,我创建了一个名为 defs
的子目录,并将 classdef.py3 和 races.py3 文件放入其中。我创建了 __init__.py3
文件,并将 import defs
放入 dmtool.py3
。作为测试,我将 x = 1
放在 races.py3
的最顶部,并将 print("X =", defs.x)
放在 dmtool.py3
中。我收到一条错误消息,指出该模块没有属性 x.
所以我想我的第二个问题是是否可以只使用来自其他文件的变量。我会使用 defs.x
或 defs.races.x
或 races.x
还是简单地使用 x
?我似乎找不到有效的方法。我需要弄清楚这一点,因为我将使用 races.py3
文件中定义的 class 的特定实例。
3] 我的第三个问题是前两个问题的一个简单问题。现在 races.py3
和 classdef.py3
在同一个模块中,我如何让一个访问另一个。 races.py3
必须使用 classdef.py3
中定义的 classes。
如果有任何帮助,我将不胜感激。就像我说的,我尝试查找与导入相关的其他问题,但他们的简单解决方案似乎出现了同样的错误。我没有 post 我的特定文件,因为除了我提到的以外,只有非常简单的打印行或 class 定义。没有什么会影响进口。
谢谢, 克里斯
启动 python 并输入这些命令:
>>> import sys
>>> sys.path
路径是 python 查找库的目录列表。如果您的模块不在列表中,则会找到 none。
首先,不要使用.py3
作为文件扩展名。 Python不认识
Python 3的导入系统其实很简单。 import foo
在 sys.path
中查找名为 foo 的包(目录)或模块(.py
文件)。
sys.path
包含您通常安装库的各种标准目录,以及 Python 标准库。 sys.path
的第一个条目通常是 __main__
脚本所在的目录。如果您将 Python 调用为 python -m foo.bar
,第一个条目将改为包含 foo
包的目录。
相对导入使用不同的语法:
from . import foo
这意味着 "import the foo
module or package from the package which contains the current module." 它在 PEP 328 中有详细讨论,如果您不想为每个导入指定包的整个结构,这可能很有用。