在目录之间导入模块

杰夫·尼曼

更新(显示最终代码)

由于这似乎很难解释,我分享了这个项目。对于那些遇到这个问题的人,您可以在此处查看完整的项目:

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__.pysetup.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 模块的名称不冲突。如果在这些方面一切顺利,

  1. 你试过这个吗?
    from project.mechanics import layout
  2. 如果这不起作用,请将 __init__.py 文件放在项目、显示、机制中。
    在 project/displays/__init__.py 添加from . import graphical_pacman.
    在 project/mechanics/__init__.py 添加from. import layout.
  3. 如果这些都不起作用,请从中创建一个包,导航到包根目录并将其安装在您的环境中 pip install -e .

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章