更新(显示最终代码)
由于这似乎很难解释,我分享了这个项目。对于那些遇到这个问题的人,您可以在此处查看完整的项目:
https://github.com/jeffnyman/pacumen
调出对我来说有问题的文件:
graphics_pacman
https://github.com/jeffnyman/pacumen/blob/master/displays/graphical_pacman.py
布局
https://github.com/jeffnyman/pacumen/blob/master/mechanics/layout.py
随着__init__.py
和setup.py
文件的地方,我现在能够像这样运行命令:
python displays/graphical_pacman.py
python mechanics/layout.py
现在,当执行这些命令时,所有导入都可以正确解析。您可以看到我在每个文件中使用的所有导入语句以及各个文件的位置__init__.py
。
原问题
我无法获得看似简单的工作:在目录之间导入模块。这一切都在 Python 3 中,所以__init__.py
如果我能帮上忙,我不希望文件到处都是,这里的许多答案都表明这是“正确”的方式。
我有这样的结构:
project
displays
graphical_pacman.py
mechanics
layout.py
layout.py 文件有一个名为 get_layout() 的顶级函数,我想从 graphics_pacman.py 调用它。
转到必要的最少代码,在 graphics_pacman.py 中我有:
import layout
if __name__ == '__main__':
board = layout.get_layout("test_maze.lay")
在 IDE 中显示良好,甚至为我自动完成。运行 graphics_pacman.py 让我得到这个:
File "displays/graphical_pacman.py", line 3, in <module>
import layout
ModuleNotFoundError: No module named 'layout'
然后我尝试了这个:
from mechanics.layout import get_layout
if __name__ == '__main__':
board = mechanics.layout.get_layout("test_maze.lay")
也不能这样做:
File "displays/graphical_pacman.py", line 3, in <module>
from mechanics.layout import get_layout
ModuleNotFoundError: No module named 'mechanics'
我试过这个:
from mechanics import layout
if __name__ == '__main__':
board = layout.get_layout("test_maze.lay")
我试过这个:
from layout import get_layout
if __name__ == '__main__':
board = get_layout("test_maze.lay")
不起作用。收到:
File "displays/graphical_pacman.py", line 3, in <module>
from layout import get_layout
ModuleNotFoundError: No module named 'layout'
我尝试使用相对导入(在事物前面使用 .),但这也不起作用。我也刚刚尝试使用 * 进行导入(基本上是导入所有内容)。也不起作用。当我说“不起作用”时,我得到了上述错误的一些变化。
我已经尝试了所有这些python graphical_pacman.py
,在displays
目录中和根project
目录中运行命令。每次都会出现相同的错误。
我也尝试使用 sys.path,例如 this sys.path.insert(0, '../mechanics')
。我还尝试了sys.path.append('../')
基于我在这里看到的其他答案的变体。同样,我得到的只是上述错误的变化。
我错过了什么?
第二次更新:我已发送拉取请求,请查看。
这就是我所做的:我从项目根目录中创建了一个包并使用 pip 安装它。详情如下:
添加的文件:
pacumen
__init__.py
setup.py
displays
__init__.py
library
__init__.py
mechanics
__init__.py
pacumen/__init__.py 的内容:
from . import displays
from . import library
from . import mechanics
pacumen/setup.py 的内容:
import setuptools
setuptools.setup(
name='pacumen',
version='0.01dev',
packages=['displays',
'library',
'mechanics',
],
author='jefferyman',
author_email='[email protected]',
description='Pacman. Duh.',
long_description=open('README.md').read(),
)
pacumen/displays/__init__.py 的内容:
from . import graphical_helpers
from . import graphical_pacman
from . import graphical_support
pacumen/library/__init__.py 的内容:
from . import structures
from . import utilities
pacumen/mechanics/__init__.py 的内容:
from . import grid
from . import layout
文件的变化:
pacumen/mechanics/layout.py:
from mechanics.grid import Grid
确保您的虚拟环境处于活动状态。(进一步向下的说明)。
最后,导航到项目根目录并将您的项目根目录安装为一个包:
pip install --editable . # or pip install -e . (Note the period at the end)
现在只要激活虚拟环境,应该不会有任何导入问题。请确保使用样式的导入语句:
from mechanics.grid import Grid
虚拟环境创建和激活:
对于那些阅读者来说,如果还没有制作虚拟环境,现在是制作虚拟环境的好时机。如果确保激活它。如果没有,导航到项目目录的根目录(pacumen)并运行
$ python -m venv venvdir
然后,一旦它被创建,运行:
<project-root>$ .venvdir\Scripts\activate # for windows.
OR
<project-root>$ source venvdir/bin/activate # for linux bash
更新:首先要检查的是没有循环导入,这意味着您正在从机械中导入 graphics_pacman 中的某些内容,以及从 graphics_pacman 在机械中导入其他内容。还要确保您的模块名称与内置 python 模块的名称不冲突。如果在这些方面一切顺利,
from project.mechanics import layout
from . import graphical_pacman
. from. import layout
.pip install -e .
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句