我查看了许多站点和许多相关问题,但是遵循这些问题的解决方案似乎仍然无济于事。我想也许我缺少什么,所以去吧。
我的项目是创建用于管理桌面角色扮演游戏的DM工具。我需要能够将我的项目拆分为许多不同的文件,以保持一切井井有条。 (到目前为止)我只有三个文件要使用。我有一个名为dmtool.py3
的主文件,有一个名为classdef.py3
的用于类定义的文件,还有一个名为races.py3
的用于创建种族对象的文件。
1]我的第一个问题是关于导入单个文件。我尝试用几种不同的方式来组织文件,因此,让我们假设我的所有三个文件都在同一目录中。
如果我要将类定义从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
文件中定义的类的特定实例。
3]我的第三个问题是一个简单的问题,是从前两个问题衍生而来的。现在races.py3
和classdef.py3
在同一个模块中,如何使一个访问另一个。 races.py3
必须使用在classdef.py3
中定义的类。
我真的很感谢您的帮助。就像我说的那样,我尝试查找与导入有关的其他问题,但是他们的简单解决方案似乎也出现了相同的错误。我没有发布我的特定文件,因为除了我提到的内容以外,只有非常简单的打印行或类定义。不会影响导入的任何内容。
谢谢,
克里斯
最佳答案
首先,请勿使用.py3
作为文件扩展名。 Python无法识别它。
Python 3的导入系统实际上非常简单。 import foo
通过sys.path
查找名为foo的程序包(目录)或模块(.py
文件)。sys.path
包含通常在其中安装库的各种标准目录以及Python标准库。 sys.path
的第一个条目通常是__main__
脚本所在的目录。如果您以python -m foo.bar
身份调用Python,则第一个条目将是包含foo
包的目录。
相对导入使用不同的语法:
from . import foo
这意味着“从包含当前模块的软件包中导入
foo
模块或软件包”。 PEP 328中对此进行了详细讨论,如果不想为每次导入指定包的整个结构,该功能将非常有用。