在目录之间导入模块
问题描述
更新(以显示最终代码)
因为这似乎很难解释,我分享了这个项目。对于那些遇到这个问题的人,您可以在此处查看完整的项目:
https://github.com/jeffnyman/pacumen
调出对我有问题的文件:
Graphical_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
文件的位置。
原始问题
我做不到一件看似简单的事情:在目录之间导入模块。这些都是在Python3中实现的,所以我不想把__init__.py
文件弄得到处都是,如果我能帮上忙的话,这里的许多答案都表明这是"正确"的方式。
我有一个这样的结构:
project
displays
graphical_pacman.py
mechanics
layout.py
layout.py文件有一个名为Get_Layout()的顶级函数,我希望从GRAPHICAL_pacman.py调用该函数。
转到所需的最低代码,在GRAPHICAL_PACMAN.py中:
import layout
if __name__ == '__main__':
board = layout.get_layout("test_maze.lay")
在IDE中显示得很好,甚至为我自动完成它。运行GRAPHICAL_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'
我尝试使用相对导入(与.在事物面前),但这也不起作用。我还尝试使用*进行导入(实质上是导入所有内容)。也不管用。当我说"不起作用"时,我得到了上述错误的一些变体。
在displays
目录中和根project
目录中运行python graphical_pacman.py
命令,我已经尝试了所有这些方法。每次都会出现相同的错误。
我还尝试使用sys.path,如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='something@something.com',
description='Pacman. Duh.',
long_description=open('README.md').read(),
)
包装/显示内容/__init__.py:
from . import graphical_helpers
from . import graphical_pacman
from . import graphical_support
包/库/__init__.py:
from . import structures
from . import utilities
包装/机械/__init__.py:
内容from . import grid
from . import layout
文件更改:
PACUMEN/MECHANILES/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
虚拟环境创建和激活:
对于读者来说,现在是创建虚拟环境的好时机如果还没有创建虚拟环境的话。如果是这样的话,一定要激活它。如果没有,请导航到项目目录(Paumen)的根目录,然后运行
$ python -m venv venvdir
然后,在创建后,运行:
<project-root>$ .venvdirScriptsactivate # for windows.
OR
<project-root>$ source venvdir/bin/activate # for linux bash
更新:首先要检查的是没有循环导入,这意味着您正在从GRAPHICAL_PACMAN中导入一些GRAPHICAL_PACMAN中的内容,并从GRAPHICAL_PACMAN中导入其他力学中的内容。另外,请确保您的模块名称不会与内置的python模块名称冲突。如果这些方面都很好,
- 您试过了吗?
from project.mechanics import layout
- 如果不起作用,请在项目、显示、机械中放置__init__.py文件。
在项目/显示/__init__.py中添加from . import graphical_pacman
。
在项目/机械/__init__.py中添加from. import layout
。 - 如果这两种方法都不起作用,请使用
pip install -e .
创建一个包,导航到包根目录并将其安装在您的环境中
相关文章